25
뇌뇌 뇌뇌뇌뇌 SQL Server 2005 9뇌. 뇌뇌뇌

뇌를 자극하는 SQL Server 2005

  • Upload
    dianne

  • View
    116

  • Download
    0

Embed Size (px)

DESCRIPTION

뇌를 자극하는 SQL Server 2005. 9 장 . 인덱스. 인덱스 개념. 책의 뒷부분에 있는 색인 ( 또는 찾아보기 ) 와 비슷한 개념 작은 데이터에는 없어도 별 차이가 없지만 , 대량의 데이터에는 인덱스가 있어야만 데이터를 빠른 시간에 검색할 수 있음 인덱스의 장단점 장점 검색은 속도가 무척 빨라질 수 있다 . ( 물론 반드시 그런 것은 아니다 .) 그 결과 시스템의 부하가 줄어들어서 , 결국 시스템 전체의 성능이 향상된다 . 단점 - PowerPoint PPT Presentation

Citation preview

뇌를 자극하는

SQL Server 2005

9 장 . 인덱스

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

2 / 25

인덱스 개념 책의 뒷부분에 있는 색인 ( 또는 찾아보기 ) 와 비슷한 개념 작은 데이터에는 없어도 별 차이가 없지만 , 대량의 데이터에는

인덱스가 있어야만 데이터를 빠른 시간에 검색할 수 있음

• 인덱스의 장단점▫ 장점

검색은 속도가 무척 빨라질 수 있다 . ( 물론 반드시 그런 것은 아니다 .) 그 결과 시스템의 부하가 줄어들어서 , 결국 시스템 전체의 성능이 향상된다 .

▫ 단점 인덱스가 데이터베이스 공간을 차지해서 추가적인 공간이 필요해 진다 . ( 대략

데이터베이스의 10% 내외의 공간이 추가로 필요하다 ) 인덱스를 생성하는데 시간이 많이 소요될 수 있다 . 데이터의 변경 작업 (Insert, Update, Delete) 이 자주 일어날 경우에는 성능이

많이 나빠질 수도 있다 .

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

3 / 25

인덱스 종류

▫종류 클러스터형 인덱스 영어사전과 비슷한 개념 비클러스터형 인덱스 일반 책의 ‘찾아보기’와 비슷한 개념

▫특징 클러스터형 인덱스는 테이블당 1 개만 생성 비클러스터형 인덱스는 테이블당 여러 개 생성 클러스터형 인덱스는 행 데이터를 인덱스로 지정한 열에

맞춰서 자동 정렬한다 . 제약조건 없이 테이블 생성시에 인덱스를 만들 수 없다 . 인덱스가 자동생성되기 위한 열의 제약조건은 Primary Key 와

Unique 뿐이다 .

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

4 / 25

• 실습 목표▫ 제약조건 생성시에 자동으로 생성되는 인덱스를 파악한다 .▫ 클러스터형 /비클러스터형 인덱스를 직접 지정해서 생성하는

방법을 익힌다 .

• 제약조건과 인덱스 생성 예CREATE TABLE tbl2

( a INT PRIMARY KEY,b INT UNIQUE,c INT UNIQUE,d INT

)

< 실습 1> 제약조건은 통한 인덱스 생성

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

5 / 25

인덱스의 내부 작동 (1)

• B-Tree(Balanced Tree, 균형 트리 )▫ 기본 개념

범용적으로 사용되는 데이터 구조 인덱스를 표현할 때 많이 사용됨 . 데이터의 검색 (Select) 시에 뛰어난 성능을 보일 수 있음 데이터의 변경 (Insert,Update,Delete) 시에 성능이 나빠짐

FFFLLL

AAA

AAA

DDDBBB

FFF

J J JHHH

LLL

OOOMMM

루트 노드(Root Node)또는 루트 페이지

리프 노드(Leaf Node)또는 리프 페이지

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

6 / 25

인덱스의 내부 작동 (2)

• 분할 1 (III 삽입후의 변화 )

FFFLLL

AAA

AAA

DDDBBB

FFF

J J JIII

HHH

LLL

OOOMMM

루트 노드(Root Node)또는 루트 페이지

리프 노드(Leaf Node)또는 리프 페이지

한칸이동

삽입

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

7 / 25

인덱스의 내부 작동 (3)

• 분할 2 (GGG 삽입후의 변화 )

AAAFFFIII

LLL

AAABBBDDD

FFFGGGHHH

LLLMMMOOO

루트 노드(Root Node)또는 루트 페이지

리프 노드(Leaf Node)또는 리프 페이지

IIIJ J J

새 페이지 확보 후에데이터 분할(= 페이지 분할)

새 페이지

FFFGGGHHH

IIIJ J J

새로운 페이지 등록세번째 리프 페이지

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

8 / 25

인덱스의 내부 작동 (4)

• 분할 3 (PPP,QQQ 삽입후의 변화 )

AAAFFFIII

AAABBBDDD

PPP 삽입

FFFGGGHHH

IIIJ J J

네번째 리프 페이지

LLLMMMOOOPPP

QQQ 삽입으로 인해서리프 페이지의페이지 분할

네번째 리프 페이지

LLLMMMOOO

새 페이지

PPPQQQ

LLLMMMOOO

PPPQQQ

LLLPPP

AAALLL

새 페이지

새 페이지

루트노드의페이지 분할로중간노드가형성됨

새로운루트 생성

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

9 / 25

클러스터형 인덱스와 비클러스터형 인덱스 구조 (1)

• 인덱스가 없는 테이블의 내부 구성 ( 페이지당 4 개의 행이 입력된다고 가정 )

LCSJ J JPJ YPJ S 박지성

이천수조재진박주영데이터 페이지

(Head 영역)

SKHLYPKNIAJ H 안정환

설기현이영표김남일 CJ C

SJ K 송종국최진철

1000 1001 1002

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

10 / 25

클러스터형 인덱스와 비클러스터형 인덱스 구조 (2)

• 클러스터형 인덱스 구성 후 내부적 정렬이 일어남

KNI

J J JCJ CAJ H 안정환

김남일조재진최진철리프 페이지

=데이터 페이지(Head 영역)

PJ Y

PJ SLYPLCS 이천수

박주영박지성이영표 SKH

SJ K 송종국설기현

1000 1001 1002

SJ KLCSAJ H 1000

10021001

루트 페이지

인덱스페이지

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

11 / 25

클러스터형 인덱스와 비클러스터형 인덱스 구조 (3)

• 비클러스터형 인덱스 구성 후 정렬 되지 않음

LCS

J J JPJ Y

PJ S 박지성

이천수조재진박주영데이터 페이지

(Head 영역)

SKH

LYPKNI

AJ H 안정환

설기현이영표김남일 CJ C

SJ K 송종국최진철

1000 1001 1002

1000+#4LCS

1001+#2KNIJ J J

CJ C

AJ H 1001+#1

1000+#3

1002+#2

1000+#2PJ Y1002+#1SJ K

1001+#4SKH

1001+#3LYP

1000+#1PJ S

리프 페이지

루트 페이지

인덱스페이지 100 200

LYP

AJ H 100

200

10

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

12 / 25

클러스터형 인덱스와 비클러스터형 인덱스 구조 (4)

• 클러스터형 인덱스에 ‘ HJY’, ‘DTY’ 추가 후

DTY

CJ C

AJ H 안정환

당탕이최진철

리프 페이지=데이터 페이지

(Head 영역)

PJ Y

PJ S

LYP

LCS 이천수

박주영박지성이영표 SKH

SJ K 송종국설기현

1000 1001 1002

1002SJ K

LCS

HJ Y

AJ H 1000

1001

2000

루트 페이지

인덱스페이지

KNI

J J J

HJ Y 한주연

김남일조재진

2000

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

13 / 25

클러스터형 인덱스와 비클러스터형 인덱스 구조 (5)• 비클러스터형 인덱스에 ‘ HJY’, ‘DTY’ 추가 후

LCSJ J JPJ YPJ S 박지성

이천수조재진박주영데이터 페이지

(Head 영역)

SKHLYPKNIAJ H 안정환

설기현이영표김남일

DTYHJ YCJ CSJ K 송종국

당탕이한주연최진철

1000 1001 1002

1001+#2KNI1000+#3J J J1002+#3HJ Y

LCS

DTYCJ CAJ H 1001+#1

1000+#4

1002+#41002+#2

1000+#2PJ Y1002+#1SJ K1001+#4SKH

1001+#3LYP1000+#1PJ S

리프 페이지

루트 페이지

인덱스페이지 100 200

LYPAJ H 100

200

10

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

14 / 25

클러스터형 인덱스와 비클러스터형 인덱스 구조 (6)

• 클러스터형 인덱스의 특징 클러스터형 인덱스의 생성시에는 데이터페이지 전체를 다시 정렬하게 된다 . 그러므로 , 클러스터형 인덱스를 생성은 심각한 시스템 부하를 줄 수 있다 . 클러스터형 인덱스는 인덱스 자체의 리프 페이지가 곧 데이터이다 . 비 클러스터형 보다 검색속도는 더 빠르다 . 하지만 , 데이터의 입력 /수정 /

삭제는 더 느리다 . 클러스터 인덱스는 성능이 좋지만 , 테이블에 한 개밖에 생성하지 못한다 .

그러므로 , 어느 열에 클러스터형 인덱스를 생성하느냐에 따라서 시스템의 성능이 달라질 수 있다 .

• 비클러스터형 인덱스의 특징 비클러스터형 인덱스의 생성시에는 데이터페이지는 그냥 둔 상태에서 별도의

페이지에 인덱스를 구성한다 . 비클러스터형 인덱스는 인덱스 자체의 리프 페이지는 데이터가 아니라

데이터가 위치하는 포인터 (RID) 이다 . 클러스터형 보다 검색속도는 더 느리지만 , 데이터의 변경은 더 빠르다 . 비클러스터형 인덱스는 여러 개 생성할 수가 있다 . 하지만 , 함부로 남용할

경우에는 오히려 시스템의성능을 떨어뜨리는 결과를 초래할 수 있다 .

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

15 / 25

< 실습 2> 클러스터형과 비클러스터형의 혼합

• 실습 목표▫ 클러스터형 인덱스와 비클러스터형 인덱스가 혼합되어 있을 때의

내부구조를 이해한다 .

김남일 KNI박주영 PJ Y박지성 PJ S설기현 SKH송종국 SJ K

안정환 AJ H이영표 LYP이천수 LCS조재진 J J J최진철 CJ C

리프 페이지

루트 페이지

Name열에 대한비클러스터형인덱스페이지

100 200

김남일 100안정환 200

10

AJ H 안정환 강원CJ C 최진철 제주J J J 조재진 충북KNI 김남일 경북

리프 페이지=데이터 페이지

(Head 영역)

LCS 이천수 인천LYP 이영표 전북PJ S 박지성 서울PJ Y 박주영 경기

SJ K 송종국 경기SKH 설기현 서울

1000 1001 1002

AJ H 1000LCS 1001SJ K 1002루트 페이지

useID 열에 대한클러스터형인덱스페이지

20

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

16 / 25

인덱스 생성 , 변경 , 삭제 (1)

• 인덱스 생성 구문CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name ) | filegroup_name | default } ]

• <relational_index_option> 부분 PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | IGNORE_DUP_KEY = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | DROP_EXISTING = { ON | OFF } | ONLINE = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

17 / 25

인덱스 생성 , 변경 , 삭제 (2)

• 인덱스 변경 구문ALTER INDEX { index_name | ALL } ON <object> { REBUILD [ [ WITH ( <rebuild_index_option> [ ,...n ] ) ] | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> [ ,...n ] ) ] ] ] | DISABLE | REORGANIZE [ PARTITION = partition_number ] [ WITH ( LOB_COMPACTION = { ON | OFF } ) ] | SET ( <set_index_option> [ ,...n ] ) }

• 인덱스 제거 구문DROP INDEX 테이블이름 . 인덱스이름

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

18 / 25

< 실습 3> 인덱스의 생성과 사용

• 실습 목표▫ 인덱스의 생성 /변경 /제거 방법을 익힌다 .

• 사용 구문 예 CREATE INDEX idx_userTbl_addr

ON userTbl (addr) CREATE UNIQUE INDEX idx_userTbl_birtyYear

ON userTbl (birthYear) CREATE NONCLUSTERED INDEX

idx_userTbl_name_birthYearON userTbl (name,birthYear)

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

19 / 25

< 실습 4> 클러스터형 , 비클러스터형 인덱스 성능비교

• 실습 목표▫ 클러스터형 , 비클러스터형 인덱스의 성능이 어느것이

우수한지를 확인한다 .▫ 인덱스를 만들지 말아야 하는 경우를 알아본다 .

• 인덱스를 사용한 조회 결과

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

20 / 25

인덱스를 생성해야 하는 경우와 그렇지 않은 경우 (1)

• 인덱스는 열 단위에 생성된다 .• Where 절에서 사용되는 컬럼을 인덱스로 만든다 .• Where 절에 사용되더라도 자주 사용해야 가치가 있다 .• 데이터의 중복도가 높은 열은 인덱스를 만들어도 별 효용이 없다 .• 외래키가 사용되는 열에는 인덱스를 되도록 생성해 주는 것이 좋다 .• JOIN 에 자주 사용되는 열에는 인덱스를 생성해 주는 것이 좋다 .• INSERT/UPDATE/DELETE 가 얼마나 자주 일어나는 지를 고려한다 .• 클러스터형 인덱스는 하나만 생성할 수 있다 .• 클러스터형 인덱스가 테이블에 아예 없는 것이 좋은 경우도 있다 .• 사용하지 않는 인덱스는 제거하자 .• 계산열에도 인덱스를 활용할 수 있다 .

• 실습 목표 계산열에서 인덱스를 활용하는 방법을 익힌다 .

< 실습 5> 계산열에 인덱스 생성

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

21 / 25

인덱스를 생성해야 하는 경우와 그렇지 않은 경우 (2)

• 포괄 열이 있는 비클러스터형 인덱스를 활용하면 쿼리의 성능을 높일 수 있다 .

• 포괄 열이 있는 인덱스 특징▫ 포괄열이 있는 인덱스는 비클러스터형 인덱스에만 생성할 수 있다 . ▫ 포괄열이 있는 인덱스는 인덱스의 크기가 커지는 단점이 있다 .▫ 포괄열이 있는 인덱스 생성 후에 , 쿼리문의 성능이 급격히 향상될 수

있다 .▫ 포괄열이 있는 인덱스가 있더라도 SELECT 의 열이 그 포괄 열에

포함되지 않으면 , 어차피 인덱스는 사용되지 않는다 .▫ 인덱스를 만들 열은 총합이 900바이트를 넘지 않아야 한다 . 그럴

경우에는 포괄열이 있는 인덱스로 만들어서 해결할 수 있다 ..

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

22 / 25

• 실습 목표 포괄 열이 있는 인덱스를 이해한다 .

< 실습 6> 포괄열이 있는 인덱스 생성

고객ID 기타열1 기타열2

111

560

33

130

고객ID 기타열1 기타열2

225

1397

1

13881

고객ID 기타열1 기타열2

8655

18877

2

315

1001 1002 1137

고객ID 페이지+오프셋 AccountNumber CustomerType

1 1002+#3 AW00000001 S

2 1137+#110 AW00000002 S

560 1001+#2 AW00000560 S

100

137개

포괄열이 있는비클러스터형인덱스페이지

데이터페이지

101 135

35개

고객ID 페이지번호

1 100

561 101

19000 135

10

……

……

고객ID 페이지+오프셋 AccountNumber CustomerType

561

562

1120

고객ID 페이지+오프셋 AccountNumber CustomerType

19000

19185

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

23 / 25

데이터베이스 엔진 튜닝 관리자

• 쿼리의 성능을 높이기 위한 도구• 쿼리의 성능을 향상시키기 위한 인덱스 생성을 권장해 줌• SQL Server 2000 의 인덱스 튜닝 마법사의 업그레이드된 도구

• 실습 목표▫ 데이터베이스 엔진 튜닝 관리자의 기본적이 사용법을 익힌다 .

< 실습 7> 데이터베이스 엔진 튜닝 관리자의 사용

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

24 / 25

분할 인덱스

• 대용량의 인덱스일 경우에 인덱스를 파일그룹별로 분할해서 성능을 높이고자 할 경우에 사용

• 특별한 경우가 아니라면 분할 테이블에 인덱스를 생성시에는 분할 테이블과 동일하게 각각의 파티션별로 인덱스가 생성됨

• 실습 목표▫ 분할인덱스를 생성하는 실습을 한다 .

< 실습 8> 분할 인덱스를 생성

뇌를 자극하는 SQL Server 2005

9 장 . 인덱스

25 / 25

인덱싱된 뷰

• 뷰의 실체는 SELECT 구문 뿐이지만 , 인덱싱된 뷰에는 실체가 존재한 존재하며 , 그 데이터는 고유 클러스터형 인덱스에 의해서 정렬되어 있는 뷰를 말한다 .

• 잘 활용할 경우 일부 쿼리의 성능을 향상시킬 수 있다 .• 실제 테이블이 변경될 경우에 인덱싱된 뷰에 존재하는 데이터도

변경되어야 하므로 시스템의 부하가 커질 수 있다 .

• 실습 목표▫ 인덱싱된 뷰의 생성 및 사용법을 확인한다 .

• 실습 구문 예제CREATE VIEW vProductSum WITH SCHEMABINDING AS

SELECT P.ProductID, COUNT_BIG(*) AS Count, P.Name, SUM(O.OrderQty) AS SumOrderQty,

SUM(O.LineTotal)……

< 실습 9> 인덱싱된 뷰의 활용