2008-09-15 15 views
34

मुझे लॉग तालिका से सभी पंक्तियों को हटाना पड़ा जिसमें 5 मिलियन पंक्तियां थीं।बड़ी तालिका में सभी डेटा को हटाने का सबसे तेज़ तरीका

client_log

जो एक बहुत लंबे समय ले लिया से हटा दें: मेरी प्रारंभिक कोशिश क्वेरी विश्लेषक में निम्न आदेश जारी करने के लिए किया गया था।

उत्तर

67

truncate table देखें जो बहुत तेज़ है।

+4

TRUNCATE सबसे तेज़ है, बस याद रखें कि आप घटना में कुछ रोलबैक करने में सक्षम नहीं होंगे। –

+9

TRUNCATE के बारे में एक नोट, यदि कॉलम में से कोई एक पहचान कॉलम है TRUNCATE उस कॉलम की SEED को प्रारंभिक मान (तालिका को परिभाषित करते समय निर्दिष्ट) पर रीसेट कर देगा। तो एक मायने में यह एक ब्रांड नई टेबल के साथ शुरू करने की तरह है। मुझे टेबल – kristof

+0

टेबल को दोबारा बदलने से पहले डेटा की सफाई के लिए उपयोगी लगता है हां, और ओरेकल वर्ल्ड में हम इसे वॉटरमार्क शिफ्ट कहते हैं, दूसरों के बारे में निश्चित नहीं है। –

0

हां, ठीक है, 5 मिलियन पंक्तियों को हटाने में शायद एक लंबा समय लगेगा। एकमात्र संभावित रूप से तेज़ तरीका मैं सोच सकता हूं कि तालिका को छोड़ना और इसे फिर से बनाना होगा। यह केवल काम करता है, बेशक, यदि आप तालिका में सभी डेटा हटाना चाहते हैं।

0

कम तालिका client_log

आपका सर्वश्रेष्ठ दांव है, मारता मेज और सूचकांकों में सभी सामग्री को छोटा कर देते हैं और किसी भी बीज तुम भी मिल गया है रीसेट करता है।

1

SQL सर्वर पर आप Truncate Table कमांड का उपयोग कर सकते हैं जो नियमित रूप से हटाए जाने से तेज़ है और कम संसाधनों का भी उपयोग करता है। यह किसी भी पहचान फ़ील्ड को बीज मूल्य पर भी रीसेट कर देगा।

ट्रंकेट की कमी यह है कि इसका उपयोग उन टेबलों पर नहीं किया जा सकता है जिन्हें विदेशी कुंजी द्वारा संदर्भित किया जाता है और यह किसी भी ट्रिगर्स को आग नहीं लगाएगा। यदि कुछ भी गलत हो तो आप डेटा को रोलबैक करने में सक्षम नहीं होंगे।

30

मैंने एमएसडीएन ट्रांजैक्ट-एसक्यूएल संदर्भ में ट्रंकेट तालिका की खोज की। यहां रुचि रखने वालों के लिए टिप्पणियां हैं:

ट्रंकेट तालिका किसी भी प्रकार के खंड के साथ विलम्ब विवरण को कार्यात्मक रूप से समान नहीं है: दोनों तालिका में सभी पंक्तियों को हटा दें। लेकिन ट्रंकेट टेबल तेजी से है और DELETE की तुलना में कम सिस्टम और लेनदेन लॉग संसाधनों का उपयोग करता है।

DELETE कथन एक समय में पंक्तियों को हटा देता है और प्रत्येक हटाई गई पंक्ति के लिए लेनदेन लॉग में एक प्रविष्टि रिकॉर्ड करता है। ट्रंकेट टेबल तालिका के डेटा को संग्रहीत करने के लिए उपयोग किए जाने वाले डेटा पृष्ठों को हटाकर डेटा को हटा देता है, और लेन-देन लॉग में केवल पृष्ठ हटाना रिकॉर्ड किया जाता है।

ट्रंकेट टेबल तालिका से सभी पंक्तियों को हटा देता है, लेकिन तालिका संरचना और इसके कॉलम, बाधाएं, इंडेक्स और इतने पर रहते हैं। नई पंक्तियों के लिए पहचान द्वारा उपयोग किया गया काउंटर कॉलम के लिए बीज पर रीसेट किया जाता है। यदि आप पहचान काउंटर को बनाए रखना चाहते हैं, तो इसके बजाय DELETE का उपयोग करें। यदि आप तालिका परिभाषा और उसके डेटा को हटाना चाहते हैं, तो ड्रॉप तालिका विवरण का उपयोग करें।

आप एक विदेशी कुंजी बाधा द्वारा संदर्भित तालिका पर TRUNCATE तालिका का उपयोग नहीं कर सकते हैं; इसके बजाय, WHERE खंड के बिना DELETE कथन का उपयोग करें। चूंकि TRUNCATE तालिका लॉग नहीं है, यह ट्रिगर को सक्रिय नहीं कर सकता है।

ट्रंकेट टेबल का उपयोग अनुक्रमित दृश्य में भाग लेने वाली तालिकाओं पर नहीं किया जा सकता है।

5

संदर्भ TRUNCATE तालिका के लिए भी MySQL

1

truncate table पर काम करता है नहीं एसक्यूएल मंच स्वतंत्र है। यदि आपको संदेह है कि कभी भी डेटाबेस प्रदाताओं को बदल सकता है, तो आप इसका उपयोग करने से सावधान रह सकते हैं।

+6

क्या डीबीएमएस नहीं करता है ' TRUNCATE तालिका का समर्थन नहीं करते?ओरेकल, एसक्यूएल सर्वर, साइबेस एएसई, माईएसक्यूएल, पोस्टग्रेएसक्यूएल, डीबी 2 - सभी समर्थन ट्रंकेट टेबल –

0

"ड्रॉप और फिर से तालिका को फिर से बनाने" का सुझाव शायद एक अच्छा नहीं है क्योंकि यह आपकी विदेशी कुंजी को गुमराह करता है।

आप विदेशी कुंजी का उपयोग कर रहे हैं, है ना?

1

ध्यान दें कि यदि आप उनका उपयोग कर रहे हैं तो TRUNCATE किसी भी ऑटो वृद्धिशील कुंजी को भी रीसेट कर देगा।

यदि आप अपनी ऑटो वृद्धिशील कुंजी खोना नहीं चाहते हैं, तो आप सेट में हटाकर हटा सकते हैं (उदा।, तालिका से हटाएं जहां आईडी> 1 और आईडी < 10000)। यह इसे काफी तेज़ी से बढ़ाएगा और कुछ मामलों में डेटा को लॉक होने से रोक देगा।

0

मैं अपने पहले बयान में संशोधन कर रहा हूँ:

आप को समझना चाहिए कि TRUNCATE का उपयोग करके डेटा साफ़ हो जाएगा लेकिन कुछ भी नहीं लेनदेन लॉग में लॉग इन किया जाएगा। लॉग पर लिखने का कारण है कि DELETE हमेशा 5 मिलियन पंक्तियों पर ले जाएगा। मैं विकास के दौरान अक्सर TRUNCATE का उपयोग करता हूं, लेकिन आपको उत्पादन डेटाबेस पर इसका उपयोग करने से सावधान रहना चाहिए क्योंकि आप अपने परिवर्तनों को वापस रोल करने के लिए सक्षम नहीं होंगे। आपको तुरंत बैकअप को पर पुनर्स्थापित करने के लिए एक नया आधार स्थापित करने के बाद पूर्ण डेटाबेस बैकअप बनाना चाहिए।

उपरोक्त कथन का उद्देश्य आपको यह सुनिश्चित करने के लिए प्रेरित करना था कि आप समझें कि दोनों के बीच अंतर है। दुर्भाग्यवश, यह खराब लिखा गया है और असमर्थित बयान देता है क्योंकि मैंने वास्तव में दोनों के बीच कोई परीक्षण नहीं किया है। यह उन बयानों पर आधारित है जिन्हें मैंने दूसरों से सुना है।

MSDN से:

DELETE कथन पंक्तियों एक एक समय में दूर करता है और प्रत्येक को नष्ट कर दिया पंक्ति के लिए लेनदेन लॉग में एक प्रविष्टि रिकॉर्ड करता है। TRUNCATE तालिका द्वारा डेटा को हटा देता है पर उपयोग किए गए डेटा पृष्ठों को तालिका डेटा को संग्रहीत करता है, और केवल पृष्ठ डिलीकेशन लेनदेन लॉग में दर्ज किया जाता है।

मैं सिर्फ यह कहना चाहता था कि दोनों के बीच एक मौलिक अंतर है और क्योंकि कोई अंतर है, ऐसे अनुप्रयोग होंगे जहां एक या दूसरा अनुचित हो सकता है।

+0

क्या मुझे टेबल के बारे में और परवाह नहीं है? ड्रॉप तालिका का अर्थ है एक डिलीट या ट्रंकेट? मेरा मतलब है: एक ट्रंकेट और एक डीआरओपी करने के लिए तेज़ी से? या सिर्फ एक डीआरओपी? (एमएसएसएलएल -2008 आर 4 का उपयोग करके) – yucer

12

एक आम मिथक है कि ट्रांजैकेट किसी भी तरह लेनदेन लॉग छोड़ देता है।

यह गलतफहमी है, और एमएसडीएन में स्पष्ट रूप से उल्लेख किया गया है।

यह मिथक यहां कई टिप्पणियों में शामिल है।; की यह एक साथ उन्मूलन करते हैं)

+2

सही। Truncate एक "न्यूनतम लॉग ऑपरेशन" है, लेकिन अभी भी लॉग है। – BradC

0

आप क्योंकि विदेशी कुंजी और/या ट्रिगर के TRUNCATE टेबल उपयोग नहीं कर सकते हैं, तो आप पर विचार कर सकते हैं:

  • ड्रॉप सभी अनुक्रमित;
  • सामान्य DELETE करें;
  • सभी अनुक्रमणिका पुन: बनाएँ।

यह कुछ हद तक समाप्त हो सकता है।

3

छंटनी और हटाएं भूल जाओ। अपनी टेबल परिभाषाओं को बनाए रखें (यदि आप इसे फिर से बनाना चाहते हैं) और बस ड्रॉप टेबल का उपयोग करें।

3

मैं अतिरिक्त विधि का उपयोग टेबल को शून्य करने के लिए करता हूं, अतिरिक्त बोनस के साथ जो मुझे तालिका की एक संग्रह प्रति के साथ छोड़ देता है।

CREATE TABLE `new_table` LIKE `table`; 
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`; 
+0

लेकिन क्या आपके पास अभी भी पुराना_टेबल में सभी डेटा है? मैं देख सकता हूं कि यह क्यों उपयोगी है - लेकिन हम डेटा नहीं चाहते हैं ... –

0
DELETE * FROM table_name; 

समय से पहले अनुकूलन खतरनाक हो सकता है। ऑप्टिमाइज़िंग का मतलब कुछ अजीब करना है, लेकिन अगर यह काम करता है तो आप इसका लाभ लेना चाहेंगे।

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy; 

गति मैं इस पर निर्भर करता है लगता है के लिए ...

  • अंतर्निहित डेटाबेस: ओरेकल, माइक्रोसॉफ्ट, MySQL, PostgreSQL, दूसरों, कस्टम ...

  • मेज, यह सामग्री है, और संबंधित तालिकाओं:

हटाए गए नियम हो सकते हैं। क्या तालिका में सभी सामग्री को हटाने के लिए कोई मौजूदा प्रक्रिया है? क्या यह विशिष्ट अंतर्निहित डेटाबेस इंजन के लिए अनुकूलित किया जा सकता है? चीजों/संबंधित डेटा तोड़ने के बारे में हम कितना ख्याल रखते हैं? एक DELETE निष्पादित करना 'सुरक्षित' तरीका हो सकता है यह मानते हुए कि अन्य संबंधित तालिकाओं इस तालिका पर निर्भर नहीं हैं। क्या अन्य टेबल और प्रश्न हैं जो इस तालिका के भीतर डेटा पर संबंधित/निर्भर हैं? अगर हमें इस टेबल के बारे में ज्यादा परवाह नहीं है, तो डीआरओपी का उपयोग करना एक तेज विधि हो सकता है, फिर अंतर्निहित डेटाबेस के आधार पर।

DROP TABLE table_name; 

कितनी पंक्तियां हटाई जा रही हैं? क्या ऐसी कोई अन्य जानकारी है जो जल्दी से मिलती है जो हटाने को अनुकूलित करेगी? उदाहरण के लिए, क्या हम बता सकते हैं कि तालिका पहले से खाली है या नहीं? क्या हम बता सकते हैं कि सैकड़ों, हजारों, लाखों, लाखों पंक्तियां हैं?

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

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