MS-SQL Server

SQL Server 2008의 새로운 기능 - TABLE REBUILD

송혁 - HyokSong 2008. 2. 28. 22:15

Heap인 테이블의 가변형 데이터 타입에 보다 큰 데이터로 변경하게 되면 클러스터 인덱스와 같은 페이지 분할이 아닌, 다른 곳으로 저장 후 포인터를 가지고 있는 Forward Pointer가 생기게 됩니다.

이로 인해서 적은 데이터를 읽을경우에도 포인터로 추가 컬럼에 대한 데이터도 엑세스 하는경우에는 성능에 문제가 있었습니다.

현재 운영중인 환경에서 얼마나 많은 Forward Pointer를 사용하여 데이터를 엑세스를 하는지 확인 하는 방법은 성능모니터에서 "SQL Server:Access Methods // Forwarded Records/sec" 의 값을 추가하여 확인할 수 있습니다.

이러한 Forward Pointer를 제거 하기 위해서는 SQL Server 2008이전에는 클러스터 인덱스를 만들거나, 다른 테이블로 데이터를 일괄 입력 후 이름 변경하여 처리하는 방법 밖에는 없었습니다.

여기서 "클러스터 인덱스의 페이지 분할, Heap의 Forward Pointer에 대해 어떤게 더 좋아?~" 를 이야기를 하는 것은 아닙니다.
단지 말하고 싶은 것은 "SQL Server 2008에서는 heap인 테이블에 대해서도 REBUILD를 지원해 준다.!!" 입니다.

아래는 CTP6에서 테스트한 내용입니다.
Microsoft SQL Server code name "Katmai" (CTP) - 10.0.1300.13 (Intel X86)
    Feb 8 2008 00:06:52
    Copyright (c) 1988-2007 Microsoft Corporation
    Developer Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)

USE
TEST
GO
DROP TABLE tbl1

-- 샘플 테이블을 만들자.
SELECT TOP 10000
ROW_NUMBER() over(order by A.id) col1
,cast('HS' as varchar(1000))col2
INTO tbl1
FROM sys.sysindexes A, sys.sysindexes B,sys.sysindexes C,sys.sysindexes D,sys.sysindexes E

-- forwarded_record 및 조각화 상태를 보자.
SELECT 
    INDEX_TYPE_DESC
   ,FRAGMENT_COUNT
   ,PAGE_COUNT
   ,FORWARDED_RECORD_COUNT
FROM SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID(),DEFAULT,DEFAULT,DEFAULT,'DETAILED')
WHERE OBJECT_ID = OBJECT_ID('tbl1') /*

index_type_desc fragment_count page_count forwarded_record_count

------------------------------------------------------------ ------------HEAP                            2                       30                      0

*/

--80바이트로 업데이트를 하자

UPDATE tbl1 WITH(TABLOCKX)

set col2 = replicate('HyokSong',10)


/*

index_type_desc fragment_count page_count forwarded_record_count

------------------------------------------------------------ ------------

HEAP                               8                155                      8689

*/

--

ALTER TABLE tbl1 REBUILD

/*

index_type_desc fragment_count page_count forwarded_record_count

------------------------------------------------------------ ------------HEAP                                    2            126                  0

*/

송 혁, SQL Server MVP
sqler.pe.kr
nexondbteam.tistory.com