मैंने माना कि कमांड के "ALL" फॉर्म द्वारा किए गए प्रत्येक इंडेक्स ऑपरेशन के बाद, ट्रांजैक्शन लॉग डेटा अगले इंडेक्स पुनर्निर्माण से पहले फ्लश हो जाएगा। क्या यह है कि यह वास्तव में कैसे काम करता है, या इंडेक्स रीबिल्ड्स को लॉग इन किया जाता है जैसे कि वे एकल लेनदेन का हिस्सा हैं?
1) लॉग फ्लशिंग: SIMPLE रिकवरी मॉडल हर लेनदेन के बाद लॉग को साफ़ नहीं करता है, लेकिन चौकियों पर। ( अधिक जानकारी के लिए लिंक )
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 के अंत तक प्रतिबद्ध नहीं है, लेकिन इंडेक्स-बाय-इंडेक्स रीबिल्ड्स के लिए, वे क्रमिक रूप से प्रतिबद्ध हैं।