2009-07-10 18 views
56

Normaly मैं delete * from XXX करता हूं लेकिन इस तालिका पर बहुत धीमी गति से, यह मानक में लगभग 500k से 1m पंक्तियां होती है (यदि वह माथेर है तो एक varbinary (MAX) है।तालिका में सभी पंक्तियों को हटाएं

मूल रूप से im सोच अगर वहाँ एक त्वरित तरीका सभी सामग्री की तालिका Emty के लिए है, इसके वास्तव में तेज ड्रॉप और फिर इसे पुन: नष्ट एसक्यूएल बयान

कारण मुझे नहीं बनाना चाहते हैं के माध्यम से सामग्री को हटाने के लिए तालिका इसलिए है क्योंकि इसका भारी उपयोग और हटाना/पुन: बनाना मुझे लगता है कि एसक्यूएल सर्वर

आईएम यह भी करने का एक तरीका है क्योंकि sys के माध्यम से पंक्ति गणना प्राप्त करने का एक "चालाक" तरीका है .sysindexes, इसलिए मुझे आशा है कि सामग्री को हटाने के लिए एक समान चालाक तरीका है

उत्तर

74

Truncate tabledelete * from XXX से तेज है। Delete धीमा है क्योंकि यह एक समय में एक पंक्ति काम करता है। ऐसी कुछ स्थितियां हैं जहां छंटनी काम नहीं करती है, जिसे आप MSDN पर पढ़ सकते हैं।

+12

इसका लेनदेन लॉग में हटाई गई पंक्तियों को जोड़ने का भी प्रभाव नहीं है .. इस प्रकार, इसे वापस घुमाया नहीं जा सकता है, लेकिन डिस्क स्पेस का एक गुच्छा बर्बाद नहीं करेगा –

11

मैं टेबल TRUNCATE का उपयोग कर सुझाव है, यह तेज है और कम संसाधनों का उपयोग करता से से XXX

यहाँ संबंधित MSDN article

21

अन्य के रूप में कहा है, TRUNCATE TABLE है DELETE बहुत तेज़, लेकिन इसमें कुछ प्रतिबंध हैं (here से लिया गया):

आप टेबल पर ट्रंकेट टेबल का उपयोग नहीं कर सकते हैं:

- एक विदेशी कुंजी बाधा द्वारा संदर्भित हैं। (आप उस तालिका को छोटा कर सकते हैं जिसमें एक विदेशी कुंजी है जो संदर्भ स्वयं ही है।)
- अनुक्रमित दृश्य में भाग लें।
- लेनदेन प्रतिकृति या विलय प्रतिकृति का उपयोग करके प्रकाशित कर रहे हैं।

इन विशेषताओं में से एक या अधिक के साथ तालिकाओं के लिए, इसके बजाय DELETE कथन का उपयोग करें।

सबसे बड़ी कमी यह है कि यदि आप जिस टेबल को खाली करने की कोशिश कर रहे हैं, उसमें विदेशी कुंजी हैं, तो ट्रंकेट कॉल विफल हो जाएगी।

+0

, बहुत बढ़िया स्पष्टीकरण। Truncate के लिए +1 –

12

आप प्रश्न में तालिका का नाम बदल सकते हैं, एक समान स्कीमा के साथ एक टेबल बना सकते हैं, और फिर अपने अवकाश पर मूल तालिका छोड़ सकते हैं।

[RENAME TABLE] [1] और [CREATE TABLE] [2] आदेशों के लिए MySQL 5.1 संदर्भ मैनुअल देखें।

RENAME TABLE tbl TO tbl_old; 

CREATE TABLE tbl LIKE tbl_old; 

DROP TABLE tbl_old; -- at your leisure 

यह दृष्टिकोण एप्लिकेशन डाउनटाइम को कम करने में मदद कर सकता है।

संबंधित मुद्दे