ฉันสันนิษฐานว่าต่อไปนี้การดำเนินการแต่ละดัชนีดำเนินการโดยรูปแบบ "ALL" ของคำสั่งข้อมูลบันทึกธุรกรรมจะถูกล้างออกก่อนที่จะสร้างดัชนีครั้งต่อไป นั่นเป็นวิธีการใช้งานจริงหรือดัชนีสร้างใหม่ราวกับว่าพวกเขาเป็นส่วนหนึ่งของการทำธุรกรรมเดียว?
1) การล้างบันทึก: โมเดลการกู้คืน SIMPLE ไม่ได้ล้างบันทึกหลังจากทำธุรกรรมทุกครั้ง แต่ที่จุดตรวจสอบ ( ลิงก์สำหรับข้อมูลเพิ่มเติม)
2a) การสร้างใหม่ทั้งหมด: ใช่การสร้างใหม่ทั้งหมดทำงานเป็นธุรกรรมเดียว ดัชนีจะสร้างใหม่ภายในมีการทำธุรกรรมของตัวเอง แต่การดำเนินการโดยรวมยังไม่ได้รับการยืนยันจนกว่าจะสิ้นสุด ใช่คุณอาจ จำกัด การเติบโตของไฟล์บันทึกโดยสร้างดัชนีแต่ละรายการขึ้นใหม่ (และอาจออกคำสั่ง CHECKPOINT
2b) พิสูจน์! ที่นี่มีสคริปต์สาธิต (สร้างขึ้นในปี 2016 dev) ก่อนอื่นให้ตั้งค่าการทดสอบ 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')
ตอนนี้คุณสามารถเปรียบเทียบกิจกรรมการบันทึกระหว่างการสร้างใหม่ทั้งหมดและสร้างใหม่ทีละรายการ
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 แต่สำหรับการสร้างดัชนีทีละดัชนีพวกเขาจะดำเนินการอย่างต่อเนื่อง