(यह मूल रूप से @ डेव के जवाब के लिए एक टिप्पणी थी, लेकिन मैंने इसे अपने स्वयं के उत्तर में डाल दिया है क्योंकि यह लंबा हो गया है)
TRUNCATE है एक लॉग इन आपरेशन। यह अन्यथा ACID के अनुरूप नहीं होना चाहिए। हालाँकि, के बीच अंतर TRUNCATEऔर DELETE:
- लॉग स्पेस का उपयोग करें:
TRUNCATEकेवल लॉग पेज / एक्स्टेंट * फ़्री किया गया है, जबकि DELETEव्यक्तिगत पंक्तियों को लॉग करता है।
- लॉक का उपयोग:
TRUNCATEआमतौर पर कम ताले का उपयोग करेगा, क्योंकि यह टेबल लॉक और पेज लॉक लेता है, DELETEजिसके विपरीत पंक्ति ताले का उपयोग करता है **।
IDENTITYअनुक्रम: TRUNCATEएक मेज पर पहचान अनुक्रम को रीसेट करता है, यदि मौजूद हो।
(* एक सीमा = 8 पृष्ठ। TRUNCATEयदि वे उस एक तालिका से हैं, तो वे सभी लॉग लॉग / निकाल देंगे, अन्यथा यह अन्य अतिरिक्त पेजों से लॉग इन / पेज हटा देगा।
** इसका एक दुष्प्रभाव यह है कि DELETE FROM TABLEसंभावित रूप से तालिका में आवंटित खाली पृष्ठों को छोड़ दिया जा सकता है, इस पर निर्भर करता है कि ऑपरेशन एक अनन्य लॉक प्राप्त कर सकता है या नहीं।)
इसलिए (मूल प्रश्न पर वापस), यदि आप तालिका को खाली कर रहे हैं , तो TRUNCATE TABLEयह निर्णायक रूप से बेहतर है , DELETE FROM TABLEलेकिन संरचना को रखना चाहते हैं (NB: TRUNCATEएक मेज पर उपयोग नहीं किया जा सकता है जिसे किसी अन्य तालिका से एक विदेशी कुंजी द्वारा संदर्भित किया जाता है)।
जैसा कि @ टुल्लो की टिप्पणी में उल्लेख किया गया है, अपने डेटाबेस के रिकवरी मॉडल को भी देखें - यदि यह पूर्ण है, तो आपको या तो लॉग बैकअप लेना शुरू करना होगा, या अपने रिकवरी मॉडल को सरल में बदलना होगा। एक बार जब आप दोनों में से किसी एक को पूरा कर लेते हैं, तो संभवत : उस सभी रिक्त स्थान को पुनः प्राप्त करने के लिए आप अपनी लॉग फ़ाइल को एक बार-बंद ऑपरेशन (NB: लॉग फ़ाइल केवल ) के रूप में सिकोड़ना चाहेंगे ।
अंत में, एक और बात के बारे में पता होना चाहिए - तालिका आँकड़े। चलाने UPDATE STATISTICS <TABLENAME>' afterTRUNCATE /DELETE` तो क्वेरी अनुकूलक पुराने आंकड़े से ऊपर फिसल न हो।
TRUNCATE TABLEइसके बजाय का उपयोग करने की सलाह देता हूंDELETE FROM।