अतिथि लेखक:डेरिक हैमर (@SQLHammer)
TRUNCATE TABLE और DELETE के बीच के अंतर को अक्सर गलत समझा जाता है। मैं इस मिथक का खंडन करना चाहता हूं कि TRUNCATE TABLE को वापस नहीं लाया जा सकता:
मैनुअल पढ़ना
TRUNCATE TABLE पर पुस्तकें ऑनलाइन लेख काफी वर्णनात्मक है:
"व्यक्तिगत पंक्ति विलोपन को लॉग किए बिना, तालिका या तालिका के निर्दिष्ट विभाजन से सभी पंक्तियों को हटा देता है। TRUNCATE TABLE DELETE स्टेटमेंट के समान है जिसमें कोई WHERE क्लॉज नहीं है; हालांकि, TRUNCATE TABLE तेज है और कम सिस्टम और लेनदेन लॉग संसाधनों का उपयोग करती है।"तथ्य यह है कि TRUNCATE TABLE कम का उपयोग करता है लेन-देन लॉग संसाधनों का तात्पर्य है कि यह कुछ हद तक लेन-देन लॉग को लिखता है। आइए जानें कि कितना है और वापस लुढ़कने की इसकी क्षमता की जांच करें।
साबित करें
पहले की एक पोस्ट में, पॉल रान्डल ने इसके बारे में विस्तार से बताया था, लेकिन मुझे लगा कि इस मिथक के दोनों तत्वों का खंडन करने के लिए बहुत ही सरल रिप्रोज़ प्रदान करना उपयोगी होगा।
क्या TRUNCATE TABLE को वापस लाया जा सकता है?
यह साबित करना कि TRUNCATE TABLE को वापस रोल किया जा सकता है, काफी आसान है। मैं केवल ट्रांजेक्शन में TRUNCATE TABLE डालूंगा और उसे वापस रोल कर दूंगा।
डेमो का उपयोग करें; लेन-देन शुरू करें; [डीबीओ] से COUNT(*) [StartingTableRowCount] चुनें।[टेस्ट]; ट्रंकेट टेबल [डीबीओ]। [टेस्ट]; [dbo] से COUNT(*) [TableRowCountAfterTruncate] चुनें।तालिका में 100,000 पंक्तियाँ हैं और यह रोलबैक के बाद 100,000 पंक्तियों पर वापस आती है:
क्या TRUNCATE TABLE लॉग को लिखता है?
CHECKPOINT को क्रियान्वित करने से, हमें एक स्वच्छ प्रारंभिक बिंदु मिलता है। फिर हम ट्रंकेट टेबल से पहले और बाद में लॉग रिकॉर्ड की जांच कर सकते हैं।
डेमो का उपयोग करें;चेकपॉइंट; sys.fn_dblog (NULL, NULL) से COUNT(*) [StartingLogRowCount] चुनें; ट्रंकेट टेबल [डीबीओ]। [टेस्ट]; sys.fn_dblog (NULL, NULL) से COUNT(*) [LogRowCountAfterTruncate] चुनें;हमारे TRUNCATE TABLE कमांड ने 237 लॉग रिकॉर्ड बनाए (कम से कम शुरुआत में)। यह वही है जो हमें रोलबैक करने में सक्षम बनाता है, और कैसे SQL सर्वर परिवर्तन को शुरू करने के लिए पंजीकृत करता है।
DELETEs के बारे में क्या?
यदि DELETE और TRUNCATE TABLE दोनों लॉग में लिखते हैं और उन्हें वापस रोल किया जा सकता है, तो उन्हें क्या अलग बनाता है?
जैसा कि ऊपर BOL संदर्भ में बताया गया है, TRUNCATE TABLE कम सिस्टम और लेनदेन लॉग संसाधन लेता है। हमने पहले ही देखा है कि TRUNCATE TABLE कमांड के लिए 237 लॉग रिकॉर्ड लिखे गए थे। अब, आइए DELETE को देखें।
डेमो का उपयोग करें;चेकपॉइंट; sys.fn_dblog (NULL, NULL) से COUNT(*) [StartingLogRowCount] चुनें; [डीबीओ] से हटाएं। [टेस्ट]; sys.fn_dblog (NULL, NULL) से COUNT(*) [LogRowCountAfterDelete] चुनें;
DELETE के लिए लिखे गए 440,000 से अधिक लॉग रिकॉर्ड के साथ, TRUNCATE कमांड स्पष्ट रूप से अधिक कुशल है।
रैप-अप
TRUNCATE TABLE एक लॉग कमांड है और इसे वापस रोल किया जा सकता है, एक समकक्ष DELETE पर एक विशाल प्रदर्शन लाभ के साथ। DELETE तब महत्वपूर्ण हो जाता है जब आप तालिका में मौजूद से कम पंक्तियों को हटाना चाहते हैं (चूंकि TRUNCATE TABLE WHERE क्लॉज को स्वीकार नहीं करता है)। DELETEs को और अधिक कुशल बनाने के बारे में कुछ विचारों के लिए, हारून बर्ट्रेंड की पोस्ट देखें, "बड़े डिलीट ऑपरेशन को टुकड़ों में तोड़ें।"
लेखक के बारे में
डेरिक एक डेटा पेशेवर है और SQL सर्वर पर केंद्रित Microsoft डेटा प्लेटफ़ॉर्म MVP है। उनका जुनून उच्च उपलब्धता, आपदा वसूली, निरंतर एकीकरण और स्वचालित रखरखाव पर केंद्रित है। उनके अनुभव ने वित्तीय और स्वास्थ्य सेवा उद्योगों में काम करने वाले दीर्घकालिक डेटाबेस प्रशासन, परामर्श और उद्यमिता उपक्रमों तक फैलाया है। वह वर्तमान में सबवे फ्रैंचाइज़ वर्ल्ड मुख्यालय में डेटाबेस संचालन टीम के प्रभारी वरिष्ठ डेटाबेस प्रशासक हैं। जब वह घड़ी पर नहीं होता है, या SQLHammer.com पर ब्लॉगिंग नहीं करता है, तो डेरिक अपना समय #sqlfamily को स्टैमफोर्ड, CT में FairfieldPASS SQL सर्वर उपयोगकर्ता समूह के अध्याय नेता के रूप में समर्पित करता है।