SQL Server/SQL Server Tip

페이지 분할이 발생 하였을 때 롤백을 하면 어떻게 될까?

SungWookKang 2015. 7. 23. 09:45
반응형

페이지 분할이 발생 하였을 때 롤백을 하면 어떻게 될까?

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

페이지 분할이 발생하였을 때 롤백을 시도할 경우 분할된 페이지도 롤백이 될까? 다음 실습을 통해서 알아 보자.

 

실습을 위해 데이터베이스와 테이블을 생성한다. 페이지 분할을 발생 시킬 수 있는 클러스터 인덱스를 생성한다.

USE MASTER;

GO

 

CREATE DATABASE pagesplittest;

GO

 

USE pagesplittest;

GO

 

CREATE TABLE t1 (c1 INT, c2 VARCHAR (1000));

GO

 

CREATE CLUSTERED INDEX t1c1 ON t1 (c1);

GO

 

 

페이지 분할을 위해 데이터를 입력 한다. 분할을 할 수 있도록 C1값에 간격을 두었다.

INSERT INTO t1 VALUES (1, REPLICATE ('a', 900));

INSERT INTO t1 VALUES (2, REPLICATE ('b', 900));

INSERT INTO t1 VALUES (3, REPLICATE ('c', 900));

INSERT INTO t1 VALUES (4, REPLICATE ('d', 900));

-- leave a gap at 5

INSERT INTO t1 VALUES (6, REPLICATE ('f', 900));

INSERT INTO t1 VALUES (7, REPLICATE ('g', 900));

INSERT INTO t1 VALUES (8, REPLICATE ('h', 900));

INSERT INTO t1 VALUES (9, REPLICATE ('i', 900));

GO

 

 

DBCC IND 명령을 사용하여 페이지 인덱스 정보를 확인 한다.

DBCC IND ('pagesplittest', 't1', 1);

GO

 

 

  • PageFID : 페이지 파일 ID
  • PagePID : 파일에서 페이지 번호
  • IAMFID : 이 페이지를 매핑하는 IAM 페이지 파일 ID
  • IAMPID : 이 페이지를 매핑하는 IAM 페이지 파일의 페이지 번호
  • ObjectID : 객체 ID
  • IndexID : 인덱스 페이지 ID
  • PartitionNumber : 파티션 번호
  • PartitionID : 페이지의 내부의 파티션ID
  • PageType : 페이지 유형(1-데이터 페이지, 2-인덱스 페이지, 3,4-텍스트페이지, 8-GAM페이지, 9-SGAM페이지, 10-IAM페이지, 11-PFS페이지)
  • IndexLevel : 인덱스 수준
  • NextPageFID, NextPagePID :인덱스 페이지의 이중 연결 목록에서 다음 페이지의 페이지ID
  • PrevPageFID, PrevPagePID :인덱스 페이지의 이중 연결 목록에서 dlwjs 페이지의 페이지ID

 

 

DBCC PAGE 명령을 이용하여 페이지의 정보를 확인 한다. 현재 744 바이트 공간이 남아 있다. 이는 같은 페이지에 다른 행을 삽입 할 수 있음을 뜻한다.

DBCC TRACEON (3604);

GO

 

DBCC PAGE (pagesplittest, 1, 119, 3);

GO

 

 

 

다음 스크립트를 실행하여 강제로 페이지 분할을 발생 시켜 본다. 그리고 인덱스 정보를 확인 한다.

BEGIN TRAN;

GO

 

INSERT INTO t1 VALUES (5, REPLICATE ('a', 900));

GO

 

 

DBCC IND ('pagesplittest', 't1', 1);

GO

 

 

인덱스 페이지를 보면 두 개의 페이지가 추가된 것을 확인 할 수 있다. 이제 사용자 트랜잭션을 롤백하고 어떻게 되는지 확인해 보자.

rollback tran

go

 

DBCC IND ('pagesplittest', 't1', 1);

GO

 

 

데이터를 롤백 되었음에도 불구하고 롤백 결과 페이지는 분할된 상태로 그대로 유지 되었다.

 

따라서 한번 분할된 페이지는 원래의 페이지로 롤백 되지 않는다는 것을 확인 할 수 있다.

 

[참고자료]

http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-using-dbcc-page-and-dbcc-ind-to-find-out-if-page-splits-ever-roll-back/

 

 

2014-02-17 / 강성욱 / http://sqlmvp.kr

 

반응형