본 게시물은 개인적인 의견으로 작성되었으니 절대적인 정보가 아닐 수 있습니다. 참고만 하시고 궁금한 사항이 있으시면 연락주세요.

티스토리 뷰

Forwarding 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

http://sqlblog.com/blogs/tibor_karaszi/archive/2009/08/28/heaps-forwarding-pointers-alter-table-rebuild-and-non-clustered-indexes.aspx

 

본 게시물은 개인적인 의견으로 작성되었으니 절대적인 정보가 아님을 알려드립니다.

참고만 하시고 궁금한 사항이 있으시면 연락주시기 바랍니다.


댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday