Я припускав, що після кожної операції з індексом, виконаної командою "ВСЕ", дані журналу транзакцій будуть очищені до наступної перебудови індексу. Це, як воно насправді працює, чи відновлення індексу реєструється так, ніби вони є частиною однієї транзакції?
1) Промивання журналу: модель SIMPLE відновлення не очищає журнал після кожної транзакції, але на контрольних точках. ( посилання для отримання додаткової інформації)
2а) ВІДНОСНУЙТЕ ВСІ: так, ПОВЕРНУТИСЯ ВСІХ працює як одна операція. Поновлення індексу всередині мають свої власні транзакції, але загальна операція не повністю здійснена до кінця. Так, так, ви можете обмежити зростання файлів журналів, переробивши окремі індекси (і, можливо, видавши команди CHECKPOINT).
2б) Доказ! Тут є демонстраційний сценарій. (Побудовано у 2016 р.) По-перше, встановіть тестовий 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
Зверніть увагу, як перша відкрита транзакція (ID транзакції 0000: 000002fa для мене) не вчиняється до кінця ВИСТАВКИ ВСІХ, але для відновлення індексу за індексом вони послідовно виконуються.