(यह मूल रूप से @ डेव के जवाब के लिए एक टिप्पणी थी, लेकिन मैंने इसे अपने स्वयं के उत्तर में डाल दिया है क्योंकि यह लंबा हो गया है)
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>' after
TRUNCATE /
DELETE` तो क्वेरी अनुकूलक पुराने आंकड़े से ऊपर फिसल न हो।
TRUNCATE TABLE
इसके बजाय का उपयोग करने की सलाह देता हूंDELETE FROM
।