sqlian 제 7차 세미나 자료 - cuvix.co.kr server에 대한 기본적인 이해 sql server에...

Post on 20-May-2018

223 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

SQLian 제 7차 세미나 자료

SQL Server Data Architecture

작성자: 강동운(eastluck@lycos.co.kr)

발표일: 2012.05.29

이 주제를 이해하는데 필요한 지식 SQL Server에 대한 기본적인 이해

SQL Server에 대한 전반적인 지식

Level

100 ~ 300

강사 소개

강동운(Software Engineer)

Electronic Arts FIFA Online 3

Email: eastluck@lycos.co.kr

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 행 구조

감사합니다.

top related