Zakładałem, że po każdej operacji indeksu wykonywanej przez komendę „WSZYSTKO” dane dziennika transakcji zostaną wyczyszczone przed kolejną odbudową indeksu. Czy tak to faktycznie działa, czy też rejestruje się przebudowy indeksu tak, jakby były częścią pojedynczej transakcji?
1) Płukanie dziennika: model odzyskiwania SIMPLE nie usuwa dziennika po każdej transakcji, ale w punktach kontrolnych. ( link, aby uzyskać więcej informacji)
2a) ODBUDUJ WSZYSTKO: tak, ODBUDUJ WSZYSTKO działa jako pojedyncza transakcja. Indeks odbudowuje w ramach własnych transakcji, ale cała operacja nie jest w pełni zatwierdzona do końca. Tak, możesz ograniczyć wzrost pliku dziennika, odbudowując poszczególne indeksy (i ewentualnie wydając polecenia CHECKPOINT).
2b) Dowód! Tutaj masz skrypt demonstracyjny. (Wbudowane w 2016 dev) Najpierw skonfiguruj testową bazę danych z tabelą i indeksami:
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')
Teraz możesz porównać aktywność dziennika między REBUILD ALL a odbudowaniem indywidualnie
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
Zwróć uwagę, że pierwsza otwarta transakcja (dla mnie identyfikator transakcji 0000: 000002fa) nie jest zatwierdzana do końca ODBUDUJ WSZYSTKO, ale w przypadku przebudowań indeks po indeksie są one zatwierdzane sukcesywnie.