페이지 분할이 발생 하였을 때 롤백을 하면 어떻게 될까?
- 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 |
데이터를 롤백 되었음에도 불구하고 롤백 결과 페이지는 분할된 상태로 그대로 유지 되었다.
따라서 한번 분할된 페이지는 원래의 페이지로 롤백 되지 않는다는 것을 확인 할 수 있다.
[참고자료]
2014-02-17 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
Fast recovery 와 로그 잠금 (0) | 2015.07.23 |
---|---|
고스트 클린업 (0) | 2015.07.23 |
DBCC WRITEPAGE - DBCC 명령을 사용한 데이터 파괴하기 (0) | 2015.07.23 |
SQL Server Backup Error 3023 (0) | 2015.07.23 |
Delete 작업과 페이지 offset 변화 (0) | 2015.07.23 |