Ich nahm an, dass nach jeder Indexoperation, die von der "ALL" -Form des Befehls ausgeführt wird, die Transaktionsprotokolldaten vor der nächsten Indexwiederherstellung gelöscht werden. Funktioniert das tatsächlich so oder werden die Neuerstellungen des Index so protokolliert, als wären sie Teil einer einzelnen Transaktion?
1) Protokolllöschung: Das SIMPLE-Wiederherstellungsmodell löscht das Protokoll nicht nach jeder Transaktion, sondern an Kontrollpunkten. ( Link für mehr Infos)
2a) REBUILD ALL: Ja, REBUILD ALL funktioniert als einzelne Transaktion. Die Index-Neuerstellungen in haben ihre eigenen Transaktionen, aber die gesamte Operation wird erst am Ende vollständig festgeschrieben. Ja, Sie können das Wachstum von Protokolldateien einschränken, indem Sie einzelne Indizes neu erstellen (und möglicherweise CHECKPOINT-Befehle absetzen).
2b) Beweis! Hier haben Sie ein Demo-Skript. (Build in 2016 dev) Richten Sie zuerst eine Test-Datenbank mit Tabelle und Indizes ein:
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')
Jetzt können Sie die Protokollaktivität zwischen REBUILD ALL und der einzelnen Neuerstellung vergleichen
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
Beachten Sie, dass die erste offene Transaktion (Transaktions-ID 0000: 000002fa für mich) erst am Ende von REBUILD ALL festgeschrieben wird. Bei den indexweisen Neuerstellungen werden sie jedoch nacheinander festgeschrieben.