Я предполагал, что после каждой операции с индексом, выполняемой формой «ВСЕ» команды, данные журнала транзакций будут сбрасываться до следующей перестройки индекса. Так ли это на самом деле, или перестройки индекса записываются так, как будто они являются частью одной транзакции?
1) Очистка журнала: модель восстановления ПРОСТА не очищает журнал после каждой транзакции, но на контрольных точках. ( ссылка для получения дополнительной информации)
2a) REBUILD ALL: да, REBUILD ALL работает как одна транзакция. Перестройки индекса внутри имеют свои собственные транзакции, но общая операция не завершена до конца. Так что да, вы можете ограничить рост файла журнала, перестраивая отдельные индексы (и, возможно, выполняя команды CHECKPOINT).
2б) Доказательство! Здесь есть демо-скрипт. (Построен в 2016 г.) Сначала создайте тестовую базу данных с таблицей и индексами:
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
Обратите внимание, что первая открытая транзакция (идентификатор транзакции 0000: 000002fa для меня) не фиксируется до конца REBUILD ALL, но для перестроений с индексом по индексу они фиксируются последовательно.