티스토리 뷰
Forwarding Records(Forwarded Records) on SQL Server Heap Tables
AWS-in 2015. 11. 27. 16:26Forwarding Records(Forwarded Records) on SQL Server Heap Tables
힙테이블에서 데이터가 INSERT OR UPDATE 쿼리가 수행될 때 데이터페이지(8K) 가 FULL 일경우에 다른 페이지에 데이터가 들어가게 된다.
그러나 Update 일 경우에 기존의 데이터가 있는 페이지가 FULL 이 될 경우에 다른페이지에 Update 된 데이터가 들어가게 된다. 이때 기존의 데이터페이지에서 이동된 데이터를 찾을 때 연결고리가 필요하다. 이때 Forwarding Pointer(Forwarded Pointer) 가 찍히며 해당 포인터를 찾아가서 데이터를 찾아오게 된다.
이렇게 되면, 데이터가 SELECT 시 더 많은 페이지를 찾아가므로 성능저하가 발생한다.
페이지가 변경이 심한 경우에는 인덱스테이블로 사용을 권장한다.
단, INSERT만 테이블일 경우에는 경우에 따라 힙테이블이 더 빠를 수 있으므로 비교하면 좋을 것 같다.
Forwarding Records(Forwarded Records) 되는 상황과 늘어나는 페이지의 대한 테스트를 [참고문서]를 통해서 확인이 가능하다.
그리고, 힙테이블도 리빌드(REBUILD) 작업이 가능하며, 페이지 개수가 감소되는 것을 확인할 수 있다.
<LAB>
USE Tempdb
GO
-- DROP TABLE TBL_HEAP
CREATE TABLE TBL_HEAP
(
col1 int identity(1,1),
cll2 char(2000),
col3 varchar(2000)
)
INSERT INTO TBL_HEAP VALUES
(REPLICATE('1', 2000), ''),
(REPLICATE('1', 2000), ''),
(REPLICATE('1', 2000), ''),
(REPLICATE('1', 2000), ''),
(REPLICATE('1', 2000), '')
GO 100
-- 페이지 상태 확인
SELECT
OBJECT_NAME(ps.object_id) as TableName,
i.name as IndexName,
ps.index_type_desc,
ps.page_count,
ps.forwarded_record_count,
--ps.avg_fragmentation_in_percent,
ps.avg_page_space_used_in_percent,
ps.avg_record_size_in_bytes
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'DETAILED') AS ps
INNER JOIN sys.indexes AS i
ON ps.OBJECT_ID = i.OBJECT_ID
AND ps.index_id = i.index_id
WHERE OBJECT_NAME(ps.object_id) = 'TBL_heap'
GO
SP_SPACEUSED TBL_HEAP;
GO
Page_Count : 139, Forwarded_record_count : 0
-- Big Data UPDATE
UPDATE TBL_HEAP SET col3 = REPLICATE('9', 2000) -- where col1 =4
Page_Count : 254, Forwarded_record_count : 231
-- Heap Table Rebuilding
ALTER TABLE TBL_heap REBUILD
Page_Count : 250, Forwarded_record_count : 0 , 여기서 중요한 것은 Page_Count 수가 줄어들은것에 의미를 둬야한다.
지금은 500 RowCount로 테스트를 한 것 이지만 더 많은 데이터일 경우에는 페이지 감소를 더 확인할 수 있다.
[참고문서]
Forwarding Pointers in Heaps
http://www.sql-server-performance.com/2013/forwarding-pointers-in-heaps/
Forwarding Records on Heap Tables
http://www.sqlpassion.at/archive/2014/09/08/forwarding-records-on-heap-tables/
Heaps, forwarding pointers, ALTER TABLE REBUILD and non-clustered indexes
본 게시물은 개인적인 의견으로 작성되었으니 절대적인 정보가 아님을 알려드립니다.
참고만 하시고 궁금한 사항이 있으시면 연락주시기 바랍니다.'SQL Server' 카테고리의 다른 글
SQL Agent JOB에서 xp_cmdshell 으로 logman.exe(성능카운터수집)를 수행시 실패할 때 (0) | 2015.12.11 |
---|---|
SQL Server 데이터베이스 기본 위치 변경하기 (0) | 2015.12.07 |
SQL Server 2008 Upgrade Advisor 로 SQL 2000 Server로 연결하는 방법 (0) | 2015.11.25 |
SQL Server에 Kerberos 인증 사용 (1) | 2015.11.20 |
Install SQL Server Using a Configuration File(구성파일) (0) | 2015.11.18 |
- Total
- Today
- Yesterday