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

 

  • 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/

 

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice [IT재직자] 개강임박!! 올해 마지막 무료 및 국비지원 교육 (JAVA, 리눅스 기초/고급 , CCNA, CCIE 등) 코난(김대우) 2022.12.02 123
Notice 2022년 11월 SQLER의 강좌 업데이트 리스트 코난(김대우) 2022.12.01 24
Notice 2022 공개SW 페스티벌 - Open Up 코난(김대우) 2022.12.01 15
1943 성능분석 9탄 – 쿼리 실행 분석 jevida(강성욱) 2016.10.15 4137
1942 성능분석 8탄 – IO 통계 (DISK 활동 분석) jevida(강성욱) 2016.10.15 1487
1941 성능분석 7탄 – 프로파일러 대기 유형 및 PREEMPTIVE_OS_WRITEFILEGATHER jevida(강성욱) 2016.10.15 1659
1940 성능분석 6탄 – CPU 경합 및 동시성 관련 대기 유형 jevida(강성욱) 2016.10.15 1921
1939 성능분석 5탄 – 메모리 및 네트워크 관련 대기 유형 jevida(강성욱) 2016.10.15 2057
1938 성능분석 4탄 – 디스크 및 IO 관련 대기 유형 jevida(강성욱) 2016.10.15 2182
1937 성능분석 3탄 – 집계 대기 통계 jevida(강성욱) 2016.10.15 1954
1936 성능분석 2탄 – 실행 요청을 기다리는 작업 확인 및 분석 (병렬 처리 대기 확인) jevida(강성욱) 2016.10.15 1398
1935 성능분석 1탄 – 실행 요청을 기다리는 작업 확인 및 분석 jevida(강성욱) 2016.10.15 2037
1934 확장이벤트를 사용하여 데드락 정보 확인 jevida(강성욱) 2016.10.15 1582
1933 확장 이벤트를 사용한 CPU 고부하 쿼리 추적 [1] jevida(강성욱) 2016.10.15 2159
1932 데이터에 대한 이해와 spill in tempdb jevida(강성욱) 2016.10.13 1781
1931 로그 파일이 많으면 왜 안 좋은가 jevida(강성욱) 2016.10.13 2085
1930 트랜잭션 백업 실패와 전체 백업 성공 그리고 대처 방안 jevida(강성욱) 2016.10.13 1571
1929 Fast recovery 와 로그 잠금 jevida(강성욱) 2016.10.13 2037
1928 고스트 클린업 jevida(강성욱) 2016.10.13 2284
» 페이지 분할이 발생 하였을 때 롤백을 하면 어떻게 될까? jevida(강성욱) 2016.10.13 1670
1926 DBCC WRITEPAGE - DBCC 명령을 사용한 데이터 파괴하기 jevida(강성욱) 2016.10.13 1659
1925 SQL Server Backup Error 3023 jevida(강성욱) 2016.10.13 2344
1924 Delete 작업과 페이지 offset 변화 jevida(강성욱) 2016.10.13 1499





XE Login

테스트 팝업
Close