2009-11-20 17 views
9

हमारे पास 150+ मिलियन रिकॉर्ड के साथ एक टेबल है। हमें सभी पंक्तियों को साफ़/हटाने की जरूरत है। हटाएं ऑपरेशन टी-लॉग को लिखने के कारण हमेशा के लिए ले जाएगा और हम पूरे डीबी के लिए हमारे रिकवरी मॉडल को नहीं बदल सकते हैं। हमने ट्रंकेट टेबल विकल्प का परीक्षण किया है।थोक हटाएं (छंटनी बनाम हटाएं)

हमें क्या एहसास हुआ कि truncate तालिका से पृष्ठों को हटा देता है, और यदि मैं गलत नहीं हूं तो उन्हें पुन: उपयोग के लिए उपलब्ध कराया जाता है लेकिन स्वचालित रूप से डीबी को कम नहीं करता है। इसलिए, अगर हम डीबी आकार को कम करना चाहते हैं, तो हमें टेबल को छोटा करने के बाद वास्तव में डीबी कमांड को चलाने की आवश्यकता होगी।

क्या यह सामान्य प्रक्रिया है? हमें कुछ भी सावधान या जागरूक होने की आवश्यकता है, या क्या कोई बेहतर विकल्प हैं?

उत्तर

1

"सभी पंक्तियों हटाएँ" ... नहीं ड्रॉप तालिका बेहतर हो (और एक ही स्कीमा/सूचकांक के साथ एक खाली एक फिर से बनाएं) हैं? (मुझे व्यक्तिगत रूप से "ताजा शुरूआत" पसंद है ;-))

यह कहा गया कि ट्रंकेट टेबल भी ठीक है, और हां, यदि आप अंतरिक्ष को पुनर्प्राप्त करना चाहते हैं तो डीबीसीसी श्राइनकीफ़ाइल की आवश्यकता हो सकती है।

0

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

+0

एसक्यूएल सर्वर पर, 'ड्रॉप table' नहीं किया जा सकता, अगर वहाँ विदेशी कुंजी की कमी कर रहे हैं। http://msdn.microsoft.com/en-us/library/ms173790.aspx – ProKiner

+0

@prokiner आपको विदेशी कुंजी संदर्भों से निपटने के लिए कोई फर्क नहीं पड़ता, चाहे कोई भी पंक्ति हटा दी जाए, घट जाए या गिरा दिया जाए, कोई रिकॉर्ड इस पंक्ति को संदर्भित करने वाली अन्य तालिकाओं में या तो पहले हटा दिया जाना चाहिए या बाधा को हटा दिया जाना चाहिए। कुछ मामलों में यह ऑन डिलीट ट्रिगर्स के साथ "स्वचालित" हो सकता है, लेकिन यह 150+ मिलियन प्रकार के डेटाबेस पर शायद ही लागू होता है। – mjv

+0

@prokiner, मुझे और अधिक स्पष्ट होना चाहिए था।वे दो अलग-अलग विचार थे, मैं इस मुद्दे को इंगित कर रहा था कि ओपी ने कहा था कि उन्होंने कटाई विधि का परीक्षण किया था। मैंने अपना जवाब साफ कर लिया है। –

1

truncate वह है जो आप खोज रहे हैं। यदि आपको बाद में डीबी को पतला करने की आवश्यकता है, तो एक संकीर्ण चलाएं।

यह MSDN refernce (यदि आप टी-एसक्यूएल बात कर रहे हैं) तो पंक्तियों को छंटनी बनाम दृश्यों के पीछे की तुलना करता है।

+0

जैसा कि अन्य टिप्पणियों ने नोट किया है, आपको अपनी विदेशी कुंजी बाधाओं (यदि कोई हो) से निपटना होगा, इससे कोई फर्क नहीं पड़ता कि आप किस दृष्टिकोण को चुनते हैं। मेरी वरीयता बाधाओं को अक्षम करना, तालिका को 'छंटनी' करना, अपनी बाधाओं को फिर से सक्षम करना, और फिर 'डीबीसीसी शिरिंकफाइल' (स्वयं को कुछ समय दें)। – ProKiner

0

पूर्ण डेटाबेस के आकार के आधार पर, संकीर्ण समय ले सकता है; मैंने इसे तेजी से जाने के लिए पाया है यदि यह एक बार में सभी को वापस लाने की कोशिश करने के बजाय छोटे टुकड़ों में संकुचित हो जाता है।

0

आपके पास एक तालिका से सभी रिकॉर्ड्स को हटाने के लिए एक सामान्य समाधान (truncate + shrink डीबी) है।

जैसा कि इरविन ने बताया। एक विदेशी कुंजी बाधा द्वारा संदर्भित होने पर TRUNCATE कमांड काम नहीं करेगा। तो सबसे पहले बाधाओं को छोड़ दें, तालिका को छोटा करें और बाधाओं को फिर से बनाएं।

अपने चिंतित के बारे में प्रदर्शन तोऔर यह आपके सिस्टम के लिए एक नियमित दिनचर्या है। आप पर अपनी तालिका को अपनी डेटा फ़ाइल पर ले जाना चाहते हैं, फिर केवल डेटा डेटाफ़ाइल के विरुद्ध सिकुड़ें!

0

के रूप में, ने कहा अगर आप truncate उपयोग नहीं कर सकते या ड्रॉप

SELECT 1 
WHILE @@ROWCOUNT <> 0 
    DELETE TOP (100000) MyTable 
+0

वह दोनों छंटनी या बूंद का उपयोग कर सकते हैं, हालांकि उनके किसी भी ऑपरेशन (हटाएं, ड्रॉप, छंटनी) के साथ संभावित विचार हैं जिनकी देखभाल की जानी चाहिए। – Chad

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