"ALL"형식의 명령으로 수행 된 각 인덱스 작업에 이어 다음 인덱스 재구성 전에 트랜잭션 로그 데이터가 플러시 될 것이라고 가정했습니다. 이것이 실제로 작동하는 방식입니까, 아니면 인덱스 재 구축이 마치 단일 트랜잭션의 일부인 것처럼 기록됩니까?
1) 로그 플러시 : SIMPLE 복구 모델은 모든 트랜잭션 후가 아니라 체크 포인트에서 로그를 지우지 않습니다. ( 자세한 정보는 링크 )
2a) REBUILD ALL : 예, REBUILD ALL은 단일 트랜잭션으로 작동합니다. 인덱스 재 구축에는 자체 트랜잭션이 있지만 전체 작업이 끝날 때까지 완전히 커밋되지는 않습니다. 따라서 개별 인덱스를 다시 작성하고 CHECKPOINT 명령을 실행하여 로그 파일 증가를 제한 할 수 있습니다.
2b) 증명! 여기, 데모 스크립트가 있습니다. (2016 dev에 내장 됨) 먼저 테이블과 인덱스를 사용하여 테스트 DB를 설정하십시오.
USE master
GO
CREATE DATABASE Test_RebuildLog
GO
ALTER DATABASE Test_RebuildLog
SET RECOVERY SIMPLE
GO
USE Test_RebuildLog
GO
CREATE TABLE IndexTest
(ID int identity(1,1),
a char(1),
b char(1))
CREATE CLUSTERED INDEX CIX_IndexTest_ID ON IndexTest(ID)
CREATE INDEX IX_IndexTest_a ON IndexTest(a)
CREATE INDEX IX_IndexTest_b ON IndexTest(b)
INSERT IndexTest
(a,b)
VALUES ('a','b'),('z','y'),('s','r')
이제 REBUILD ALL과 개별적으로 재 구축 간의 로그 활동을 비교할 수 있습니다.
CHECKPOINT
GO
ALTER INDEX ALL ON IndexTest REBUILD
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE Operation = 'LOP_COMMIT_XACT'
OR Operation = 'LOP_BEGIN_XACT'
GO
CHECKPOINT
GO
ALTER INDEX CIX_IndexTest_ID ON IndexTest REBUILD
ALTER INDEX IX_IndexTest_a ON IndexTest REBUILD
ALTER INDEX IX_IndexTest_b ON IndexTest REBUILD
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE Operation = 'LOP_COMMIT_XACT'
OR Operation = 'LOP_BEGIN_XACT'
GO
REBUILD ALL이 끝날 때까지 첫 번째 공개 트랜잭션 (트랜잭션 ID 0000 : 000002fa)이 커밋되지 않지만 인덱스 별 재 구축의 경우 연속적으로 커밋됩니다.