-
GAM(Global Allocation Map)SQL Server/Architecture 2012. 8. 27. 14:14
안녕하세요 ^^ 이스트럭(강동운) 입니다.
오랬만에 SQL Server 아키텍처에 관련된 자료를 소개해드립니다.
오늘은 GAM(Global Allocation Map)에 대해서 알아볼까 합니다.
우선 msdn: http://msdn.microsoft.com/ko-kr/library/ms175195(v=sql.105)
SQL Server 에서는.. 혼합 익스텐트(Mixed Extent) 와 균일 익스텐트(Uniform Extent)가 존재합니다.
그리고 각각의 익스텐트가 혼합 또는 균일인지, 비어있는지 안 비어있는지, 사용중인지 아닌지를 파악하기 위해..
GAM과 SGAM을 사용합니다.
GAM과 SGAM은 511,230 페이지마다 한개씩 나오고
GAM의 페이지 번호는 2... 따라서 다음번에 GAM이 나오는 페이지 번호는 511232 페이지가 됩니다. ^^;
GAM에서는 한개의 BIT를 통해 .. 익스텐트가 사용중 또는 사용중이 아니다! 라는 것을 표현하게 됩니다.
따라서 오늘은 BIT를 통해 어떤 식으로 할당되는지 한번 알아보도록 하겠습니다.
그리고 예제상으로.. 페이지 번호는 다를 수 있으니 참고하시기 바랍니다 ^^*
use master
GO
IF(DB_ID('eastluck') IS NOT NULL)
DROP DATABASE eastluck
GO
CREATE DATABASE eastluck
GO
use eastluck
GO
CREATE TABLE tbleastluck( idx int not null, data char(8000))
이렇게 테이블만 생성 된 뒤에 2페이지인 GAM정보를 조회해 봅시다.
DBCC TRACEON(3604)
DBCC PAGE('eastluck',1,2,2)
바이너리 순서대로 보기 위해서 DBCC PAGE의 옵션 2를 사용했습니다.
결과 화면 중에서 중요한 부분만 추려봤습니다.
GAM
62E5C000: 01080000 00020000 00000000 00005a00 †..............Z.
62E5C010: 00000000 00000200 63000000 0600f61f †........c.....ö.
62E5C020: 02000000 01000000 12000000 10000000 †................
62E5C030: 06010000 00000000 00000000 b9f0520a †............¹ðR.
62E5C040: 00000000 00000000 00000000 00000000 †................
62E5C050: 00000000 00000000 00000000 00000000 †................
62E5C060: 00005e00 00000000 00000000 00000000 †..^.............
62E5C070: 00000000 00000000 00000000 00000000 †................
62E5C080: 00000000 00000000 00000000 00000000 †................
62E5C090: 00000000 00000000 00000000 00000000 †................
62E5C0A0: 00000000 00000000 00000000 00000000 †................
62E5C0B0: 00000000 00000000 00000000 00000000 †................
62E5C0C0: 381f0000 c0ffffff ffffffff ffffffff †8...Àÿÿÿÿÿÿÿÿÿÿÿ
62E5C0D0: ffffffff ffffffff ffffffff ffffffff †ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
62E5C0E0: ffffffff ffffffff ffffffff ffffffff †ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
62E5C0F0: ffffffff ffffffff ffffffff ffffffff †ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
62E5C100: ffffffff ffffffff ffffffff ffffffff †ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
모든 페이지는 96 바이트 헤더를 가지고 있습니다. 따라서 윗 부분은 신경 안쓰고..
381F 줄 부터 보도록 하겠습니다.
62E5C0C0: 381f0000 c0ffffff ffffffff ffffffff †8...Àÿÿÿÿÿÿÿÿÿÿÿ
제 생각으로는... 381F다음 부터 나타나는 숫자들이 익스텐트 번호라고 볼 수 있습니다.
그리고.. 거꾸로 보셔야 합니다.
즉.. FE 라고 하시면.. 1111 1110 이 아니라.. 1110 1111 여기서 한번더... 0111 1111 이렇게 말이죠~
00: 0000 0000
00: 0000 0000
C0: 0000 0011
FF: 1111 1111
이렇게 되며.. 각 비트당 8 pages.. 즉 175번 pages 까지는 사용중으로 표시된 것을 볼 수 있습니다.
데이터를 9개 넣어보도록 하겠습니다.
CREATE TABLE tbleastluck( idx int not null, data char(8000))
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
insert into tbleastluck select 1,'a'
할당된 페이지를 살펴 보면..
dbcc extentinfo(eastluck,tbleastluck)
할당된 페이지를 살펴 보면..
ext_size가 1인 55,78 ~~ 94 페이지들은 Mixed Extent 에 할당이 되었고!
176 페이지는 Uniform Extent로 할당이 되었습니다.
그럼 다시 여기서 GAM 정보를 확인해볼까요?
DBCC PAGE('eastluck',1,2,2)
62E5C0C0: 381f0000 80ffffff ffffffff ffffffff †8....ÿÿÿÿÿÿÿÿÿÿÿ
아까와 비교를 해보면
62E5C0C0: 381f0000 c0ffffff ffffffff ffffffff †8...Àÿÿÿÿÿÿÿÿÿÿÿ
C0 => 80으로 변경된 것을 볼 수 있습니다.
즉.. 0000 0011 이라는 값이.. 0000 0001로 변경된 것을 볼 수 있었죠 ^^
그리고 물론 176 ~ 183 페이지는 Uniform Extent로 씌이겠지요~
16개의 데이터를 더 넣어봤습니다.
insert into tbleastluck select 1,'a'
GO 16
dbcc extentinfo(eastluck,tbleastluck)
GAM 정보를 확인해보면??
DBCC PAGE('eastluck',1,2,2)62A5C0C0: 381f0000 00feffff ffffffff ffffffff †8....þÿÿÿÿÿÿÿÿÿÿ
--처음
62E5C0C0: 381f0000 c0ffffff ffffffff ffffffff †8...Àÿÿÿÿÿÿÿÿÿÿÿ
--9개 데이터 입력
62E5C0C0: 381f0000 80ffffff ffffffff ffffffff †8....ÿÿÿÿÿÿÿÿÿÿÿ
--16개 데이터 추가 입력
62A5C0C0: 381f0000 00feffff ffffffff ffffffff †8....þÿÿÿÿÿÿÿÿÿÿ
80FF => C0FF => 00FE
C0 FF: 0000 0011 1111 1111
80 FF: 0000 0001 1111 1111
00 FE: 0000 0000 0111 1111
그런데 저도 381F는 저도 뭔지 모르겠네요 ^^;
감사합니다 ^^
작성일: 2012-08-27
작성자: 강동운