Presentation is loading. Please wait.

Presentation is loading. Please wait.

강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트

Similar presentations


Presentation on theme: "강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트"— Presentation transcript:

1 강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
B*TREE 인덱스 구조 강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트

2 목차 인덱스 개요 B*TREE 인덱스 구조 B*TREE 인덱스 생성 과정 B*TREE 인덱스 행의 구조
SQL Server 인덱스 인덱스 페이지 조각화 인덱스 검색 프로세스 이해

3 인덱스 개요 장점 단점 - 성능 개선 : 데이터 검색 시 IO 및 CPU 사용량 감소로 검색 속도 개선
- 유일성 보장 : 데이터의 유일성을 보장하는 유일한 수단 (PK, UNIQUE 제약 조건도 내부적으로는 고유 (unique) 인덱스생성) 단점 - 저장 공간 소요 : sysindexes, sp_spaceused 구문으로 사용 공간 확인 - DML 작업 시 추가 부하 발생

4 인덱스 키 + 포인터 (ROWID / Clustering Key)
B*TREE 인덱스 구조 Tree 구조로 구성됨 ( 나무를 뒤집어 놓은 구조 ) - 상위 : Root Page - 중간 : Intermediate Page - 하위 : Leaf Page 인덱스 시작점 리프 레벨 포인터 인덱스 키 + 포인터 (ROWID / Clustering Key) Root Page --- Leaf Page Intermediate Page

5 … B*TREE 인덱스 생성 과정 Leaf Level을 먼저 구성하고 Leaf Page가 2개 이상으로
분할 시 새로운 Root Level 추가 Root Page가 2개 이상으로 분할 시 새로운 Root Page 추가 기존의 Root는 Intermediate Page가 된다. 인덱스 페이지는 이중 링크로 구성되어 페이지간 연결 정보 유지 Root (single page) Root B - 인덱스 Root  Intermediate Root Leaf Root  Leaf

6 B*TREE 인덱스 행의 구조 인덱스 페이지 행 (리프 페이지가 아닌 경우) 인덱스 페이지 행 (힙 테이블 상의 리프 페이지)
인덱스 페이지 행 (리프 페이지가 아닌 경우) Header Index Key Column Down Page ID Down Page File ID No. of Columns NULL bitmap 1byte 4bytes 2bytes 1bit/Cols 인덱스 페이지 행 (힙 테이블 상의 리프 페이지) Header Index Key Column Book Mark Page ID File ID Slot ID NULL bitmap 1byte 4bytes 2bytes 1bit/Cols 인덱스 페이지 행 (클러스터 형 인덱스 상의 리프 페이지) Header Index Key Column No. of Columns NULL bitmap No. of Variable Variable Column Header Clustered 1byte 2bytes 1bit/Cols 2bytes/Cols

7 인덱스 키 + 포인터 (ROWID / Clustering Key) DATA ( CLUSTERED INDEX )
SQL Server 인덱스 NON-CLUSTERED INDEX - 리프 레벨 CLUSTERED INDEX 인덱스 키 + 포인터 (ROWID / Clustering Key) 데이터 페이지 Root Page --- Leaf Page --- ----- Intermediate Page ---- B - 인덱스 DATA ( CLUSTERED INDEX ) DATA ( HEAP )

8 insert emp (name,title…) values (‘이소진’, ‘대리’ …)
인덱스 페이지 조각화 insert emp (name,title…) values (‘이소진’, ‘대리’ …) Non-Leaf Level 가기순 :298 김태훈 :302 이소민 :306 임세령 :310 < =이소진 이소진 3:320:1 Leaf Level (key Value) Page 298 Page 302 Page 305 Page 310 인덱스에서 Page Splits 3:137:1 이소진 3:137:3 이수희 3:137:2 이소정 3:145:1 이소영 이소민 가기순 3:133:3 공국진 3:111:2 공대열 3:129:4 김태훈 3:102:3 남수중 3:133:0 남현주 3:102:0 3:137:1 이소진 3:145:1 이소영 이소민 임세령 3:200:3 임용찬 3:188:0 임희찬 3:172:1 3:137:2 이수희 3:320:1 이소진 3:137:1 이소정

9 인덱스 키 + 포인터 (Clustering Key)
비클러스터형 인덱스의 구조 변화 클러스터형 인덱스가 있는 상태에서의 비클러스터형 인덱스 구조 인덱스 키 + 포인터 (Clustering Key) DATA ( CLUSTERED INDEX ) 클러스터드 인덱스의 레벨수 –1 만큼의 I/O가 추가 새로운 데이터 삽입시 NON-Clustered INDEX의 추가 부하 발생이 없다 단점 장점 B - 인덱스

10 Demo : 인덱스 포인터 정보 확인 포인터 정보 (ROWID or 클러스터형 인덱스 키) 확인

11 select * from emp where name=‘이소정’
비클러스터형 인덱스를 사용한 데이터 검색 select * from emp where name=‘이소정’ sysindexes Indid=2 Root=400 Root Page 400 가기순 :301 김태훈 :302 이소민 :305 임세령 :310 < =’이소정’ Page 301 Page 305 Leaf Level (key Value) Page 302 Page 310 가기순 3:133:3 공국진 3:111:2 공대열 3:129:4 김태훈 3:102:3 남수중 3:133:0 남현주 3:102:0 이소민 3:137:1 이소영 3:145:1 이소정 3:137:2 임세령 3:200:3 임용찬 3:188:0 임희찬 3:172:1 Clustered 되지 않은 Index가 있는 Heap에서 Data 검색 HEAP BOOK MARK NAVIGATION Page 101 Page 102 Page 120 Page 137 Page 205 10000 이종인 10001 황희정 10002 류경석 10003 최철원 10004 남현주 10005 이동희 10006 김태훈 10007 정원혁 10008 최인규 10009 전복희 10010 임무호 10011 송원석 10024 이수희 10025 이소민 10026 이소정 10027 황인숙 10068 홍태영

12 select * from emp where empno = 10006
클러스터형 인덱스를 사용한 데이터 검색 select * from emp where empno = 10006 sysindexes Indid=1 Root=100 Root Page 100 :101 :102 :120 :137 :205 < =10006 Leaf Clustered Index가 있는 테이블에서 Data 검색 Page 101 Page 102 Page 120 Page 137 Page 205 10000 이종인 10001 황희정 10002 류경석 10003 최철원 10004 남현주 10005 이동희 10006 김태훈 10007 정원혁 10008 최인규 10009 전복희 10010 임무호 10011 송원석 10024 이수희 10025 이소민 10026 이소정 10027 황인숙 10068 홍태영

13 select * from emp where name=‘이소정’ BOOK MARK NAVIGATION (10026)
클러스터형 인덱스가 있는 테이블에서 비클러스터형 인덱스를 사용한 데이터 검색 select * from emp where name=‘이소정’ sysindexes Indid=2 Root=400 Root Page 400 가기순 3:301 김태훈 3:302 이소민 3:305 임세령 3:310 < =’이소정’ Page 301 Page 305 Leaf Level (key Value) Page 302 Page 310 가기순 10044 공국진 10043 공대열 10013 김태훈 10006 남수중 10066 남현주 10004 이소민 10025 이소영 10063 이소정 10026 임세령 10051 임용찬 10039 임희찬 10057 Clustered 되지 않은 Index가 있는 Heap에서 Data 검색 BOOK MARK NAVIGATION (10026) sysindexes Indid=1 Root = 100 Clustered Index ROOT

14 BOOK MARK NAVIGATION (10026)
클러스터형 인덱스가 있는 테이블에서 비클러스터형 인덱스를 사용한 데이터 검색 (2) BOOK MARK NAVIGATION (10026) Root Page 100 :101 :102 :120 :137 :205 < =10026 Leaf Level (DATA) Clustered Index가 있는 테이블에서 Data 검색 Page 101 Page 102 Page 120 Page 137 Page 205 10000 이종인 10001 황희정 10002 류경석 10003 최철원 10004 남현주 10005 이동희 10006 김태훈 10007 정원혁 10008 최인규 10009 전복희 10010 임무호 10011 송원석 10024 이수희 10025 이소민 10026 이소정 10027 황인숙 10068 홍태영

15 Demo : 인덱스 사용 시 IO 분석 인덱스 사용 시 IO 분석

16 요약 B*TREE 인덱스의 구조 - Bottom-Up 방식으로 생성 되며 루트 페이지 하나를 유지함
- 루트-중간-리프 페이지로 구성 - 리프 페이지는 인덱스 키 컬럼 +포인터로 구성됨 비클러스터형 인덱스 - 단일 행 또는 적은 범위의 검색에 효율적인 구조 - 클러스터형 인덱스의 존재 여부에 따라서 포인터 정보가 행 구별자(ROWID) 또는 클러스터형 인덱스 키러 구성됨 클러스터형 인덱스 - 일반 B*TREE 인덱스와 구조는 동일하나 리프 페이지가 데이터인 구조 - 범위 검색 / 집계 연산 등에 효율적

17 강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
B*TREE 인덱스 정보 확인하기 강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트

18 목차 B*TREE 인덱스 기본 정보 확인 B*TREE 인덱스 통계 정보 확인 B*TREE 인덱스 조각화 확인

19 B*TREE 인덱스 기본 정보 확인 sysindexes 시스템 테이블 id indid first root first IAM
dpages statblob rows rowmodctr Id : 기반 오브젝트 ID ( table / view) Indid : index ID First : Leaf-level 의 시작 페이지 주소 Root : 인덱스의 시작점 주소 First IAM : 첫 IAM 페이지 주소 Dpages : leaf-level 페이지의 개수 Statblob : 통계페이지 (image 로 저장) Rows : 인덱스의 행 수 Rowmodcrt : 통계 업데이트 기준 / 최근 통계 업데이트 후 변경된 행의 개수 0: HEAP : 클러스터형 인덱스 ~250: 비클러스터형 인덱스 : BLOB page Heap 에서 Data 검색

20 Demo : 인덱스 기본 정보 확인 sysindexes 시스템 테이블 정보 확인

21 B*TREE 인덱스 통계 정보 확인 / 갱신 update statistics employees pk_employees
SP_HELPSTATS ‘테이블 이름’, ‘ALL’ : 테이블의 모든 통계의 이름 반환 DBCC SHOW_STATISTICS (‘테이블_이름’, ‘인덱스_이름’) : 해당 통계 페이지 정보 반환 update statistics 테이블_이름 인덱스_이름 update statistics employees pk_employees 3. ① 통계정보 ②tempdb ③blocking ④data file growth ⑤log file growth ⑥disk used percentage ⑦ parallel bug ⑧virus… 4. ① 통계정보 -> update statistics ②tempdb-> 충분한 사이즈로 변경, 개수 증가 ③blocking-> blocking process 문제 해결 (sp_broker_pas80 procedure, profiler,sp_lock,sp_who2…) ④data file growth 충분한 사이즈로 변경 / 향후 filegrowth 적정값으로 변경 ⑤log file growth  작은 트랜잭션이 빈번하게 발생하는 경우 (log backup 실행 여부) 큰 트랜잭션이 발생하는 경우 ( 충분한 사이즈로 변경 / 향후 filegrowth 적정값으로 변경 / 트랜잭션 분할 여부) ⑥disk used percentage  추가 적인 파일/파일 그룹 할당 / 물리적 디스크 할당 ( if controller permmit) ⑦ parallel bug maxdop 변경 / max worker thread 조정 ⑧virus  virus 치료

22 통계 페이지 정보 Updated Rows Rows Sampled Steps : Max 200 Density
All Density Range_Hi_Key Range_Rows EQ_Rows Distinct_Range_Rows Avg_Range_Rows

23 Demo : 인덱스 통계정보 확인 인덱스 통계 정보 확인

24 B*TREE 인덱스 조각화 정보 확인 인덱스 조각화의 영향
1) DML (insert/update/delete) : 페이지 할당 / 조각화 부하 감소  OLTP 성 효율적 2) select : range-query, group by , order by 등 seek time 증가  DW, DSS, Report 용 비효율적 조각화 여부 확인 : DBCC SHOWCONTIG

25 DBCC SHOWCONTIG (조각화의 경우)
dbcc showcontig ('tb_m_mmodel_cost_act_past','PK_tb_m_mmodel_cost_act_past') DBCC SHOWCONTIG이(가) 'tb_m_mmodel_cost_act_Past' 테이블을 스캔하는 중... 테이블: 'tb_m_mmodel_cost_act_Past' ( ); 인덱스 ID: 1, 데이터베이스 ID: 10 TABLE 수준 스캔이 수행되었습니다. - 스캔한 페이지 : - 스캔한 익스텐트 : - 전환된 익스텐트 : - 익스텐트 당 평균 페이지 수 : 7.7 - 스캔 밀도[최적:실제] : 35.17% [236013:671144] - 논리 스캔 조각화 상태 : 2.35% - 익스텐트 스캔 조각화 상태 : 35.57% - 페이지 당 사용 가능한 평균 바이트 수 : 76.7 - 평균 페이지 밀도(전체) : 99.05% DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오. select count(*) from tb_m_mmodel_cost_act_past where work_yymm='200410' CPU 시간 = 7189ms, 경과 시간 = 30181ms.

26 DBCC SHOWCONTIG (재구성 후의 경우)
dbcc showcontig ('tb_m_mmodel_cost_act_past','PK_tb_m_mmodel_cost_act_past') DBCC SHOWCONTIG이(가) 'tb_m_mmodel_cost_act_Past' 테이블을 스캔하는 중... 테이블: 'tb_m_mmodel_cost_act_Past' ( ); 인덱스 ID: 1, 데이터베이스 ID: 10 TABLE 수준 스캔이 수행되었습니다. - 스캔한 페이지 : - 스캔한 익스텐트 : - 전환된 익스텐트 : - 익스텐트 당 평균 페이지 수 : 7.9 - 스캔 밀도[최적:실제] : 98.28% [236013:240140] - 논리 스캔 조각화 상태 : 0.42% - 익스텐트 스캔 조각화 상태 : 0.11% - 페이지 당 사용 가능한 평균 바이트 수 : 76.7 - 평균 페이지 밀도(전체) : 99.05% DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오. select count(*) from tb_m_mmodel_cost_act_past where work_yymm='200410' CPU 시간 = 6267ms, 경과 시간 = 14510ms.

27 요약 B*TREE 인덱스 기본 정보 확인 - sysindexes 시스템 테이블을 통해서 다음 내용 확인
( 인덱스 종류/ 행 숫자 / 통계 정보 갱신 임계값 / 사용중인 페이지 숫자 등) B*TREE 인덱스 통계 정보 확인 (DBCC SHOW_STATISTICS ) - 정기 적인 통계 정보 확인을 통한 갱신 주기 결정 - 올바른 실행 계획 생성 여부 확인 후 샘플링 비율 결정 B*TREE 인덱스 조각화 정보 확인 (DBCC SHOWCONTIG) - 정기 적인 조각화 정보 확인을 통한 인덱스 재구성 주기 결정 - 적절한 채우기 비율 (fillfactor) 결정


Download ppt "강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트"

Similar presentations


Ads by Google