이 주제를 이해하는데 필요한 지식 SQL Server에 대한 기본적인 이해
SQL Server에 대한 전반적인 지식
Level
100 ~ 300
강사 소개
강동운(Software Engineer)
Electronic Arts FIFA Online 3
Email: [email protected]
Blog: http://eastluck.tistory.com
Facebook: http://www.facebook.com/eastluck
주요 업무 및 활동
- SQL Server MVP 2012
- SQLer.com 닉네임 이스트럭(강동운)
- SQLer Vision 스터디 리더
- SQL World NULL 스터디 맴버
- 쿼리 튜닝 및 작성 전문가
Contents Page
DBCC Page, IND
Page(Offset)
Extent
- Mixed Extent
- Uniform Extent
IAM(Index Allocation Map)
Index Scan 방식
- Index Ordered Scan
- Allocation Ordered Scan
데이터 행의 구조
Page
SQL Server I/O의 기본단위 8k(8,192 bytes)
1) Page Header(96 bytes)
2) Data
3) Row Offset array
Page
SQL Server Page 의 구조
DBCC Page
DBCC TRACEON(3604)
페이지에 저장된 내부
DBCC PAGE
(디비명,파일번호,페이지번호, 옵션)
옵션(기본: Buffer Header, Page Header)
0: 기본
1: 기본 + 페이지 + 행 구분 가능, 행 오프셋
2: 기본 + 페이지 전체, 행 오프셋
3: 1번 값 + data
DBCC IND
Undocumented Command
Allocated Pages List
DBCC IND(디비명,테이블명,옵션)
옵션
0: Heap or Clustered Leaf Level
1: Clustered index
2 ~ 254: Non Clustered index
-1: 전체
-2: All IAM
DBCC IND create table dbo.Employee ( EmployeeID int not null , LastName NVARCHAR(20) , FirstName NVARCHAR(20) , HireDate DATETIME ) GO INSERT INTO dbo.Employee SELECT EmployeeID,LastName,FirstName,HireDate FROM Northwind.dbo.Employees GO --// 9 rows --// Create NonClustered Index(Non-Unique) CREATE INDEX NC_Employee_LastName ON Employee(LastName) WITH(FILLFACTOR = 1, PAD_INDEX=ON) GO
DBCC IND DBCC IND(eastluck,Employee,2) --//NonClustered Index
DBCC IND DBCC IND(‘eastluck’,’Employee’,0) --//Heap
DBCC IND
195(IAM)
(NC)
200(Root)
197(Non Leaf)
199(Non Leaf)
194(Leaf)
196(Leaf)
198(Leaf)
174: IAM
(Heap)
110(Leaf)
(Heap)
DBCC IND DBCC IND(‘eastluck’,’Employee’,-1) --//ALL
Page(Offset)
행의 시작 위치(2 Bytes) 정렬을 관리하기 위해 사용
Sample picture
Page(Offset)
Q. Clustered Index 정말 물리적으로 정렬이 되어 있을까?
□ True □ False V
Page(Offset)
...
Page(Offset)
idx: 1 idx: 2 idx: 19 idx: 20
Row Offset Array로 Data 순서를 관리한다.
Extent
순차적인 8개 페이지의 집합
0~7, 8~15, 16~23 …
Extent의 시작 페이지 % 8 = 0
Mixed Extent(혼합 Extent)
Uniform Extent(균일 Extent)
Extent(Mixed Extent)
80 pages 81 pages 82 pages 83 pages 84 pages 85 pages 86 pages 87 pages
■ Character Table Clustered Index ■ MissionLog Table Clustered Index ■ Item Table Non-Clustered Index ■ CharacterState Table Non-Clustered Index ■ Quest Table Heap IAM ■ Inventory Table Heap
Extent(Uniform Extent)
88 pages 89 pages 90 pages 91 pages 92 pages 93 pages 94 pages 95 pages
■ Character Table Clustered Index
Extent 할당
처음 8개의 페이지까지는 Mixed Extent 할당
그 후 데이터는 Uniform Extent 할당.
예외) 인덱스 조각 모음
SELECT INTO
T1118 옵션 등 ..
DBCC EXTENTINFO(디비명, 테이블명, indexid)
Extent 할당
Mixed Extent
Uniform Extent
...
Extent
DEMO
Extent Example
Mixed 1
1
10
Mixed 2
Root
Page
Mixed 3
20
30
Mixed 4
40
50
Mixed 5
60
70
Mixed 6
80
90
Mixed 7
100
110
Mixed 8
120
130
Uniform
140
150
Uniform
160
170
Uniform
180
190
Uniform
200
210
5
Uniform
10
INSERT
Extent Example
Mixed 1
1
5
Mixed 2
Root
Page
Mixed 3
20
30
Mixed 4
40
50
Mixed 5
60
70
Mixed 6
80
90
Mixed 7
100
110
Mixed 8
120
130
Uniform
140
150
Uniform
160
170
Uniform
180
190
Uniform
200
210
DELETE
1000
2000
INSERT
Uniform
10
IAM
Index Allocation Map
Heap 또는 Index에 할당 된 Mixed
Extent, Uniform Extent의 정보를
가지고 있음.
1개의 IAM은 4G 의 데이터를 관리
IAM 구조
1:176
Single Page Allocation @0x3632C08E
Slot 0 = (1:174) Slot 1 = (1:41) ...
Extent Alloc Status Slot 1 @0x3632C0C2
(1:0) -(1:168) = NOT ALLOCATED
(1:176) -(1:184) = ALLOCATED
(1:192) -(1:256) = NOT ALLOCATED
(1:264) -(1:288) = ALLOCATED
(1:296) -(1:328) = NOT ALLOCATED
(1:336) -(1:22624)= ALLOCATED
...
Pointer to
first
1:47120
Pointer to
first IAM
1:26610
1:26610
1:177 1:178 1:179 1:180 1:181 1:182 1:183
1:174
1:41
1:73
1:80
1:89
1:109
1:114
1:120
1:184 1:185 1:186 1:187 1:188 1:189 1:190 1:191
1:264 1:265 1:266 1:267 1:268 1:269 1:270 1:271
orderid custid empid shipperid orderdate filler
------- ----------- ----- --------- --------- ------
343505 C0000004736 167 C 20040516 a
347736 C0000014160 146 G 20040523 a
386520 C0000019321 300 I 20040622 a
...
416891 C0000004708 135 I 20040901 a
440317 C0000019120 81 E 20041005 a
717441 C0000001686 271 I 20051114 a
IAM INTERNAL EXAMPLE DBCC TRACEON(3604) DBCC page(eastluck,1,201,3) --//IAM
IAM: Single Page Allocations @0x000000001069C08E Slot 0 = (1:200) Slot 1 = (1:194) Slot 2 = (1:195) Slot 3 = (1:196) Slot 4 = (1:197) Slot 5 = (1:198) Slot 6 = (1:199) Slot 7 = (1:208) IAM: Extent Alloc Status Slot 1 @0x000000001069C0C2 (1:0) - (1:288) = NOT ALLOCATED (1:296) - (1:304) = ALLOCATED (1:312) - (1:5144) = NOT ALLOCATED
Mixed Extent
Uniform Extent
IAM
Header
Data
약 8,xxx bytes
Offset
IAM Page
1 bytes
1 0 1 1 1 0 1 1
8 bits 1 B I t
1 Uniform Extent
8 pages
About 64,000 Extents(8,000 bytes=> 64,000 bit)
About 51x,xxx Pages
About 4,1xx,xxx,xxx bytes
+ 8개의 Mixed Extent (파일번호 + 페이지번호)
Index Scan 방식
Index Ordered Scan
Allocation Ordered Scan
- 64 pages 초과(65 부터..)
- read-only or readuncommitted
- 실행계획 ordered 연산자 false
Index Scan 방식
Clustered
Index
Index Ordered Scan
Allocation Ordered Scan
Index Scan 방식
IAMPointer to
first IAM
Clustered
Index
Index Scan
DEMO
Root Page Split Use northwind GO DROP INDEX dbo.Employee.NC_Employee_LastName GO --//9개의 행을 가지고 있음 ALTER TABLE dbo.Employee ALTER COLUMN LastName CHAR(850) GO CREATE INDEX NC_Employee_LastName ON Employee(LastName) WITH(FILLFACTOR = 100, PAD_INDEX=ON) GO
DBCC IND(eastluck,Employee,2) --//197 is both root and leaf page.
Root Page Split DBCC TRACEON(3604) DBCC PAGE(eastluck,1,197,3) WITH TABLERESULTS
INSERT INTO dbo.Employee SELECT 10,’Full’,’TEST’,GETDATE())
Root Page Split DBCC IND(eastluck,Employee,2)
197: Left Leaf(default Root) 200: Root 201: Right Leaf
Root Page Split(SQL 2005) DBCC PAGE(eastluck,1,200,3) WITH TABLERESULTS
DBCC PAGE(eastluck,1,197,3) WITH TABLERESULTS
DBCC PAGE(eastluck,1,201,3) WITH TABLERESULTS
Root Page Split(SQL 2005 이상)
195: IAM
200(Root)
197(Non Leaf)
201(Non Leaf)
197(Root and Leaf)
SPLIT
Root Page Split(SQL 2000)
195: IAM
197(Root)
200(Non Leaf)
201(Non Leaf)
197(Root and Leaf)
SPLIT
1-1. 데이터 행의 구조
고정 컬럼 총 사이즈 + 4
A ghost forwarded
고정 컬럼 데이타
가변 컬럼 수
가변 컬럼의 끝나는 바이트
가변 컬럼의 데이타
데이터 행의 구조
1-1. 데이터 행의 구조 인덱스 행의 구조
X
X
1-1. 데이터 행의 구조 데이터 행의 구조(Status A)
Record Attributes
1 0 1 1 1 0 1 1
4 bits
Record Type
4 bits
Bit 0: SQL2008에서는 항상 0 Bit 1 ~ 3: 0: a primary key record(0000) 1(2): a forwarded record(0010) 2(4): a forwarding stub(0100) 3(6): an index record(0110) 4(8): a blob fragment or row-overflow data(1000) 5(A): a ghost index record(1010) 6(C): a ghost data record(1100) 7(E): a ghost version record(1110)
1-1. 데이터 행의 구조 데이터 행의 구조(Status A)
Bit 4: Null Bitmap 존재 여부. Bit 5: row에variable-length 컬럼이 존재하는지 여부 Bit 6: row에 버전 정보를 포함하는지 여부 (Database가 ALLOW_SNAPSHOT_ISOLATION, READ_COMMITTED_SNAPSHOT 옵션이 ON으로 설정되어야만 1로 나타난다.) Bit 7: 2008에서 사용하지 않는다.
Record Attributes
1 0 1 1 1 0 1 1
4 bits
Record Type
4 bits
1-1. 데이터 행의 구조
Status Bits A 예제
데이터 행의 구조(Status A)
30: 0011 0000
Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Type = PRIMARY_RECORD
3C: 0011 1100
Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Type = GHOST_DATA_RECORD
10: 0001 0000
Record Attributes = NULL_BITMAP Record Type = PRIMARY_RECORD
70: 0111 0000
Record Attributes = NULL_BITMAP VARIABLE_COLUMNS VERSIONING_INFO Record Type = PRIMARY_RECORD
1-1. 데이터 행의 구조 데이터 행의 구조(가변컬럼)
IF OBJECT_ID(‘Varchar_Dupes','U') IS NOT NULL DROP TABLE Varchar_Dupes GO CREATE TABLE dbo.Varchar_Dupes ( Col1 VARCHAR(5) NOT NULL , Col2 INT NOT NULL , Col3 INT NOT NULL , Col4 VARCHAR(3) NULL , Col5 VARCHAR(6) NOT NULL , Col6 VARCHAR(5) ) GO DBCC TRACEON(3604) GO --// 고정컬럼 총 사이즈는 INT(8)
1-1. 데이터 행의 구조 데이터 행의 구조(가변컬럼)
INSERT INTO Varchar_Dupes(Col1,Col2,Col3,Col4, Col5, Col6) VALUES('ABCDE',123, -123,'AAA',NULL,'DDD')
DBCC IND(eastluck,Varchar_Dupes,0) DBCC PAGE(eastluck,1,200,1) 0000000000000000: 30000c00 7b000000 85ffffff 06001004 0000000000000010: 001e0021 00210024 00414243 44454141 0000000000000020: 41444444
30: Status A Record Attributes = NULL_BITMAP VARIABLE_COLUMNS Record Type = PRIMARY_RECORD
00: Status B
1-1. 데이터 행의 구조 데이터 행의 구조(가변컬럼) 0000000000000000: 30000c00 7b000000 85ffffff 06001004 0000000000000010: 001e0021 00210024 00414243 44454141 0000000000000020: 41444444
0C00: 고정 컬럼 총 사이즈(INT+INT = 8) + 4 = 12 => C
7b000000: 123의 16진수 값
123 = 16*7 + 11
85ffffff: -123의 16진수 값
7b : 0000 … 0000 0111 1011
7b(1의 보수): 1111 … 1111 1000 0100
7b(2의 보수): 1111 … 1111 1000 0101 => 85
0600: 총 컬럼의 수(6개)
10: 0001 0000 (5번째 컬럼이 NULL)
1-1. 데이터 행의 구조 데이터 행의 구조(가변컬럼) 0000000000000000: 30000c00 7b000000 85ffffff 06001004 0000000000000010: 001e0021 00210024 00414243 44454141 0000000000000020: 41444444
0400: 가변길이 컬럼의 수(총 4개) = Col1, Col4, Col5, Col6
1e00: 30(1번째 가변 길이 컬럼이 끝나는 바이트) = ‘ABCDE’
2100: 33(2번째 가변길이 컬럼이 끝나는 바이트) = ‘AAA’
2100: 33(3번째 가변길이 컬럼이 끝나는 바이트) = NULL
2400: 36(4번째 가변길이 컬럼이 끝나는 바이트) = ‘DDD’
1-1. 데이터 행의 구조 데이터 행의 구조(가변컬럼) 0000000000000000: 30000c00 7b000000 85ffffff 06001004 0000000000000010: 001e0021 00210024 00414243 44454141 0000000000000020: 41444444
4142434445: Col1의 값(‘ABCDE’) ASCII 값
414141: Col4의 값(‘AAA’) ASCII 값
444444: Col6의 값(‘DDD’) ASCII 값
45는 30번째 바이트에서 끝난다.
Col5의 NULL 값은 저장되지 않는다
1-1. 데이터 행의 구조 행 구조를 통해 추론
추가 컬럼을 테이블 중간에 끼어 넣는 것 불가능!(테이블 새로 작성)
NULL 허용 컬럼은 바로 추가가 가능
기본 값이 있는 컬럼을 추가할 경우 모든 행 update
SUMMARY
Page(Header, Data, Offset)
Extent(Mixed, Uniform Extent)
IAM은 Mixed, Uniform Extent를 관리
DBCC IND, PAGE
Root 페이지 SPLIT 시 새로운 페이지할당
SQL Server 2005 이상
SQL Server 행 구조
감사합니다.