2007~2011/SQL Server2009. 11. 5. 01:40

SQL Server 기본 데이터 저장 단위 page 가 할당되는 모습을 살펴 보고자 아래 참고서적과 MSDN을 참조하여 아래와 같이 몇 가지 테스트를 했습니다.


CREATE TABLE TBLPAGE1 (
        ID INT IDENTITY,
        PAGE1 CHAR(5000) 
 )

-- 아래 2행을 17회 반복 수행한 결과입니다. 
INSERT INTO TBLPAGE1 VALUES('LAIGO')
EXEC SP_SPACEUSED TBLPAGE1

name               rows     reserved         data              index_size        unused
--------------------------------------------------------------------------
/* Mixed Extent 할당 */
TBLPAGE1       1           16 KB              8 KB               8 KB               0 KB
TBLPAGE1       2           24 KB              16 KB              8 KB               0 KB
TBLPAGE1       3           32 KB              24 KB              8 KB               0 KB
TBLPAGE1       4           40 KB              32 KB              8 KB               0 KB
TBLPAGE1       5           48 KB              40 KB              8 KB               0 KB
TBLPAGE1       6           56 KB              48 KB              8 KB               0 KB
TBLPAGE1       7           64 KB              56 KB              8 KB               0 KB
TBLPAGE1       8           72 KB              64 KB              8 KB               0 KB
/* Uniform Extent 할당 */
TBLPAGE1       9           136 KB             72 KB              8 KB               56 KB
TBLPAGE1       10          136 KB             80 KB             8 KB               48 KB
TBLPAGE1       11          136 KB             88 KB             8 KB               40 KB
TBLPAGE1       12          136 KB             96 KB             8 KB               32 KB
TBLPAGE1       13          136 KB             104 KB            8 KB               24 KB
TBLPAGE1       14          136 KB             112 KB            8 KB               16 KB
TBLPAGE1       15          136 KB             120 KB            8 KB               8 KB
TBLPAGE1       16          136 KB             128 KB            8 KB               0 KB
TBLPAGE1       17          200 KB             136 KB            8 KB               56 KB



-- 사용된 페이지, 할당된 페이지, 인덱스 및 테이블 포함 페이지 개수 확인
SELECT first, dpages FROM SYSINDEXES WHERE id = OBJECT_ID('TBLPAGE1')

dpages      reserved    used
---------------------------------
17              25            18


-- 데이터를 DELETE 해도 사용/할당된 페이지의 변화는 없음
DELETE FROM TBLPAGE1

SELECT dpages, reserved, used FROM SYSINDEXES WHERE id = OBJECT_ID('TBLPAGE1')

dpages      reserved    used
---------------------------------
17              25            18


-- 테이블의 첫 번째 페이지 정보 확인
SELECT first FROM SYSINDEXES WHERE id = OBJECT_ID('TBLPAGE1')
-- 0x720000000100
/* swap 00 00 00 72  00 01 */


SELECT CONVERT (int, 0x72)
-- 114

/* 데이터 페이지 내용 보기, 데이터 LAIGO 가 보입니다. offset 정보만 삭제되고 실제 데이터는 다른 데이터로 overwrite 되기 전까진 기존 값을 가지고 있다는 것을 확인할 수 있습니다. */
DBCC TRACEON(3604)
DBCC PAGE (LAIGO, 1, 114, 2)

0000000012A8C060:   10009013 01000000 4c414947 4f202020 †........LAIGO  


-- TRUNCATE 후 사용/할당 페이지 확인
TRUNCATE TABLE TBLPAGE1

SELECT dpages, reserved, used FROM SYSINDEXES WHERE id = OBJECT_ID('TBLPAGE1')

dpages      reserved    used
---------------------------------
0              0                0



[참고자료]
페이지 및 익스텐트 이해
http://msdn.microsoft.com/ko-kr/library/ms190969.aspx

TRUNCATE TABLE(Transact-SQL)
http://msdn.microsoft.com/ko-kr/library/ms177570.aspx


[참고문서]
전문가로 가는 지름길3 - SQL Server 2000/2005 튜닝 (정원혁, 손광수)


작성자 : Lai Go / 작성일자 : 2009.11.05

Posted by Lai Go