Tôi giả định rằng sau mỗi hoạt động chỉ mục được thực hiện bởi hình thức "TẤT CẢ" của lệnh, dữ liệu nhật ký giao dịch sẽ bị xóa trước khi xây dựng lại chỉ mục tiếp theo. Đó có phải là cách nó thực sự hoạt động hay chỉ mục được xây dựng lại được ghi lại như thể chúng là một phần của một giao dịch?
1) Xóa nhật ký: mô hình khôi phục SIMPLE không xóa nhật ký sau mỗi giao dịch, nhưng tại các điểm kiểm tra. ( liên kết để biết thêm)
2a) REBUILD ALL: có, REBUILD ALL hoạt động như một giao dịch đơn lẻ. Chỉ mục được xây dựng lại bên trong có các giao dịch riêng của họ, nhưng hoạt động chung không hoàn toàn được cam kết cho đến khi kết thúc. Vì vậy, có, bạn có thể hạn chế tăng trưởng tệp nhật ký bằng cách xây dựng lại các chỉ mục riêng lẻ (và có thể ban hành các lệnh CHECKPOINT).
2b) Bằng chứng! Ở đây, có một kịch bản demo. (Được xây dựng vào năm 2016 dev) Trước tiên, hãy thiết lập db thử nghiệm, với bảng và chỉ mục:
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')
Bây giờ bạn có thể so sánh hoạt động nhật ký giữa REBUILD ALL và xây dựng lại riêng lẻ
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
Lưu ý cách giao dịch mở đầu tiên (ID giao dịch 0000: 000002fa đối với tôi) không được cam kết cho đến khi kết thúc REBUILD ALL, nhưng đối với việc xây dựng lại theo chỉ mục, chúng được cam kết liên tiếp.