मेरे पास 42,795,120 पंक्तियों के साथ एक तालिका cats
है।42 मिलियन पंक्तियों के साथ तालिका के लिए सहसंबंधित सबक्वायरी के साथ एसक्यूएल हटाएं?
स्पष्ट रूप से यह बहुत सारी पंक्तियां हैं। तो जब मैं कार्य करें:
/* owner_cats is a many-to-many join table */
DELETE FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)
क्वेरी का समय समाप्त :(
:
मैं (संपादन मैं अपनेCommandTimeout
मूल्य में वृद्धि करने की जरूरत है, डिफ़ॉल्ट केवल 30 सेकंड है) TRUNCATE TABLE cats
का उपयोग नहीं कर सकता क्योंकि मैं अन्य मालिकों से बिल्लियों को उड़ाना नहीं चाहता हूं।
मैं एस का उपयोग कर रहा हूं "। सरल":
DELETE TOP (25) PERCENT FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)
DELETE TOP(50) PERCENT FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)
DELETE FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)
मेरा प्रश्न है: QL सर्वर 2005 "रिकवरी मॉडल" करने के लिए सेट के साथ
तो, मैं कुछ इस तरह (Btw एक आवेदन से इस एसक्यूएल को क्रियान्वित करने) करने के बारे में सोचा था कि क्या एसक्यूएल सर्वर 2005 में DELETE
पंक्तियों की संख्या की दहलीज है?
या, यदि मेरा दृष्टिकोण इष्टतम नहीं है, तो कृपया एक बेहतर दृष्टिकोण का सुझाव दें। धन्यवाद।
इस पोस्ट में मुझे काफी मदद नहीं की:
संपादित करें (2010/08/06):
ठीक है, मैं सिर्फ पढ़ने के बाद एहसास हुआ उपरोक्त लिंक फिर से कि मेरे पास इन तालिकाओं पर अनुक्रमणिका नहीं थी। इसके अलावा, आप में से कुछ ने पहले ही टिप्पणियों में उस मुद्दे को इंगित कर दिया है। ध्यान रखें कि यह एक कल्पित स्कीमा है, इसलिए id_cat
एक पीके नहीं है, क्योंकि मेरे वास्तविक जीवन स्कीमा में, यह एक अद्वितीय क्षेत्र नहीं है।
मैं सूचक डाल देंगे:
cats.id_cat
owner_cats.id_cat
owner_cats.id_owner
मुझे लगता है कि मैं अभी भी इस डेटा भंडारण के हैंग हो रही है, और स्पष्ट रूप से मैं अनुक्रमित की जरूरत है सभी JOIN
फ़ील्ड पर सही है?
हालांकि, मुझे बैच लोड प्रक्रिया करने में घंटों लगते हैं। मैं इसे पहले से ही SqlBulkCopy
(भाग में, 42 मिलियन नहीं एक बार) के रूप में कर रहा हूं। मेरे पास कुछ इंडेक्स और पीके हैं।मैं निम्न पदों जो मेरे सिद्धांत है कि अनुक्रमित नीचे भी एक थोक प्रतिलिपि धीमा कर रहे हैं इस बात की पुष्टि पढ़ें:
- SqlBulkCopy slow as molasses
- What’s the fastest way to bulk insert a lot of data in SQL Server (C# client)
तो मैं नकल से पहले अपने अनुक्रमित DROP
लिए जा रहा हूँ और फिर इसे पूरा होने पर CREATE
फिर से करें।
लंबे समय तक लोड होने के कारण, मुझे इन सुझावों का परीक्षण करने में थोड़ी देर लग जाएगी। मैं परिणामों के साथ वापस रिपोर्ट करूंगा।
अद्यतन (2010/08/07):
टॉम सुझाव: बनाम 22 सेकंड:
DELETE
FROM cats c
WHERE EXISTS (SELECT 1
FROM owner_cats o
WHERE o.id_cat = c.id_cat
AND o.id_owner = 1)
और अभी भी कोई सूचकांक, 42 लाख पंक्तियों के लिए, यह 13:21 मिनट लग गए : 08 ऊपर वर्णित तरीके से। हालांकि, 13 मिलियन पंक्तियों के लिए, उसे 2:13 बनाम 2:10 मेरा पुराना तरीका मिला। यह एक साफ विचार है, लेकिन मुझे अभी भी इंडेक्स का उपयोग करने की आवश्यकता है!
अद्यतन (2010/08/08):
कुछ बहुत गलत है! अब इंडेक्स के साथ, ऊपर मेरी पहली हटाई गई क्वेरी 1: 9 बजे: मिनट (हाँ एक घंटा!) बनाम 22:08 मिनट: सेकंड और 13:21 मिनट: सेक बनाम 2:10 मिनट: सेक के लिए 42 मिलियन पंक्तियां और 13 मिलियन पंक्तियां क्रमशः। मैं इंडेक्स के साथ टॉम की क्वेरी को आजमाने की कोशिश कर रहा हूं, लेकिन यह गलत दिशा में जा रहा है। कृपया मदद करे।
अद्यतन (2010/08/09): 42 मील पंक्तियों और 10:50 मिनट के लिए मिनट: 13 मील पंक्तियों के लिए सूचकांक बनाम 13:21 मिनट सेकंड
टॉम हटाने 01:06 बजे ले लिया : सेक और 2:13 मिनट: सेकंड क्रमशः। जब मैं परिमाण के क्रम से इंडेक्स का उपयोग करता हूं तो मेरे डेटाबेस पर हटाए जा रहे हैं! मुझे लगता है कि मुझे पता है क्यों, मेरा डेटाबेस। एमडीएफ और .ldf पहले (42 मिलियन) के दौरान 3.5 जीबी से 40.6 जीबी तक बढ़ गया! मैं क्या गलत कर रहा हूँ?
अद्यतन (2010/08/10):
-
:
- 1 घंटे के लिए डेटाबेस कनेक्शन के लिए बढ़ाएँ टाइमआउट
- उपयोग टॉम की क्वेरी (
CommandTimeout=60000;
डिफ़ॉल्ट 30 सेकंड था):DELETE FROM WHERE EXISTS (SELECT 1 ...)
क्योंकि यह प्रदर्शन एक छोटे से तेजी से DROP
सभी इंडेक्स और पीके हटाए जाने से पहले (???)- भागो
DELETE
बयान CREATE
सभी अनुक्रमित और पीकेएस
किसी भी अन्य विकल्पों की कमी के लिए, मैं क्या मुझे लगता है एक फीके समाधान (उम्मीद अस्थायी) है के साथ आए हैं
पागल लगता है, लेकिन कम से कम यह TRUNCATE
का उपयोग करने और पहले owner_id
साथ शुरू से ही मेरी लोड से शुरू की तुलना में तेजी है, क्योंकि में से एक मेरी owner_id
2:30 बजे लेता है: बनाम लोड करने के लिए न्यूनतम 17:22 मिनट: हटाए गए प्रक्रिया के लिए सेकंड मैंने अभी 42 मिल पंक्तियों के साथ वर्णित किया है। (नोट: यदि मेरी लोड प्रक्रिया अपवाद फेंकता है, तो मैं उस owner_id
के लिए शुरू करता हूं, लेकिन मैं पिछले owner_id
को उड़ाना नहीं चाहता, इसलिए मैं TRUNCATE
owner_cats
तालिका नहीं चाहता, इसलिए मैं कोशिश कर रहा हूं DELETE
का उपयोग करें।)
एनीमोर मदद अभी भी सराहना की जाएगी :)
क्या आप अपनी टेबल पर इंडेक्स के लिए क्या समझ सकते हैं? – bobs
मैं बिल्ली की नफरत नहीं हूं, लेकिन इसमें बहुत सारी पंक्तियां नहीं हैं, लेकिन यह बहुत सी बिल्लियों है :) और, यह मुझे तोड़ देता है "मैं अन्य मालिकों से बिल्लियों को उड़ाना नहीं चाहता" – bobs
क्या यह CrazyOldLady डेटाबेस? –