Saya berasumsi bahwa mengikuti setiap operasi indeks yang dilakukan oleh bentuk "ALL" dari perintah, data log transaksi akan memerah sebelum indeks berikutnya dibangun kembali. Apakah itu cara kerjanya sebenarnya, atau apakah indeks dibangun kembali seolah-olah mereka adalah bagian dari satu transaksi?
1) Pembilasan log: model pemulihan SEDERHANA tidak menghapus log setelah setiap transaksi, tetapi di pos-pos pemeriksaan. ( tautan untuk info lebih lanjut)
2a) REBUILD ALL: yes, REBUILD ALL berfungsi sebagai satu transaksi. Indeks dibangun kembali dalam memiliki transaksi sendiri, tetapi operasi keseluruhan tidak sepenuhnya berkomitmen sampai akhir. Jadi ya, Anda dapat membatasi pertumbuhan file log dengan membangun kembali indeks individual (dan mungkin mengeluarkan perintah CHECKPOINT).
2b) Bukti! Di sini, miliki skrip demo. (Dibangun pada tahun 2016 dev) Pertama, siapkan test db, dengan tabel dan indeks:
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')
Sekarang Anda dapat membandingkan aktivitas log antara REBUILD ALL dan membangun kembali secara individual
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
Perhatikan bagaimana transaksi terbuka pertama (ID Transaksi 0000: 000002fa untuk saya) tidak dilakukan sampai akhir BUANG KEMBALI SEMUA, tetapi untuk indeks-demi-indeks dibangun kembali, mereka berhasil dilakukan.