2011-12-29 32 views
7

SQL कथन में हटाने के लिए पंक्तियों की संख्या पर किस सीमा को रखा जाना चाहिए?एसक्यूएल डिलीट - पंक्तियों की अधिकतम संख्या

हमें 1 से कई सौ हजार पंक्तियों से हटाना होगा और SQL सर्वर को बिल्कुल मारने या हर बार अपशिष्ट-टोकरी खाली करने के लिए लॉग को भरने के लिए किसी प्रकार की सर्वोत्तम अभ्यास सीमा लागू करने की आवश्यकता है।

यह प्रश्न किसी भी प्रकार के डेटाबेस के लिए विशिष्ट नहीं है।

+0

इस अस्पष्ट प्रश्न का उत्तर नहीं दिया जा सकता है। कोई रजत बुलेट – zerkms

+0

नहीं है हम बैच को रात में स्थानांतरित करने के लिए एक टेबल से दूसरे स्थान पर रिकॉर्ड ले जाने के लिए उपयोग करते हैं। हम 10,000 के बैच चलाते हैं और प्रदर्शन हिट नगण्य है। – Dimitri

+0

आपको सर्वोत्तम सीमा प्राप्त करने के लिए कुछ सीमाएं और सर्वर प्रदर्शन की निगरानी करने की आवश्यकता होगी। – piotrekkr

उत्तर

12

यह एक बहुत ही व्यापक सवाल है जो मूल रूप से "यह निर्भर करता है" तक उबाल जाता है। इसे प्रभावित करने वाले कारकों में शामिल हैं:

  • आपके समेकन का स्तर क्या है? एक डिलीट स्टेटमेंट प्रभावित पंक्तियों पर एक विशेष लॉक रखता है। डाटाबेस इंजन, हटाए गए डेटा वितरण इत्यादि के आधार पर, जो पेज या पूरी तालिका में बढ़ सकता है। क्या आपके डेटा पाठकों को हटाने की अवधि के लिए अवरुद्ध किया जा सकता है?

  • हटाए गए कथन कितना जटिल है? आप कितने अन्य टेबल में शामिल हो रहे हैं, या जटिल कहां हैं? कभी-कभी हटाने के लिए पंक्तियों की पहचान हटाने के मुकाबले अधिक "महंगी" हो सकती है, इसलिए एक बड़ा हटाना "सस्ता" हो सकता है।

  • क्या आप डेडलॉक्स के बारे में डरते हैं? जैसे ही आप अपने डिलीट के आकार को कम करते हैं, आपका डेडलॉक "पैर प्रिंट" कम हो जाता है। आदर्श रूप से, सिंगल-पंक्ति डिलीट हमेशा सफल होंगे।

  • क्या आप थ्रूपुट प्रदर्शन की परवाह करते हैं? किसी भी एसक्यूएल कथन के साथ, आम तौर पर लगातार ओवरहेड (कनेक्शन सामान, क्वेरी पार्सिंग, रिटर्निंग परिणाम इत्यादि) होती है। एकल-कनेक्शन बिंदु दृश्य से, 1000-लाइन डिलीट 1000 x 1-लाइन डिलीट से तेज होगी।

  • इंडेक्स रखरखाव ओवरहेड, विखंडन सफाई, या किसी भी ट्रिगर्स के बारे में न भूलें। वे आपके सिस्टम को भी प्रभावित कर सकते हैं।

सामान्य रूप से, हालांकि, मैं प्रति पंक्ति 1000-पंक्तियों पर बेंचमार्क करता हूं। जिन प्रणालियों के साथ मैंने काम किया है (सब- "एंटरप्राइज़") प्रति डिलीट 500 और 5000 रिकॉर्ड के बीच एक मीठा स्थान के साथ समाप्त होता है। मैं कुछ इस तरह करना पसंद:

set rowcount 500 

select 1 -- Just to force @@rowcount > 0 
while @@ROWCOUNT > 0 
delete from [table] 
    [where ...] 
+0

+1, यह जोड़ देगा कि यदि आप पंक्तियों की एक निश्चित संख्या को हटा रहे हैं तो कभी-कभी इसे काम करने के लिए बेहतर होता है; इसलिए 10 से 100 को हटा दें, क्योंकि डीबी ने कुछ कामों को कैश किया है, जो कि आपके बिंदु 4 के साथ फिट बैठता है। – Ben

+0

आपके पास आमतौर पर कुछ भी करने के लिए बहुत अधिक सहायक कोड होता है लेकिन "डमी" रैंप अप होता है। मैंने यह भी पाया कि "अधिकतम" पंक्तियों/दूसरी हटाने को मारने का प्रयास बहुत व्यर्थ है। स्वीकार्य विंडो (15 सेकंड कहें) ढूंढने का एक बेहतर तरीका है, और वहां एक समय में कई पंक्तियों को हटाने का प्रयास करें। टिप्पणी छद्म कोड में: हटाने के लिए 100 पंक्तियां चुनें। हटाएं और समय की जानकारी प्राप्त करें। यदि समय <15 सेकंड, हटाने के लिए ROWS * 1.5 चुनें; अन्य हटाने के लिए पंक्तियां * 0.5 चुनें। दोहराएँ। यह आपके समय-आधारित थ्रूपुट को बढ़ाएगा, और डीबी पर अन्य गतिविधियों के प्रति संवेदनशील होगा। – jklemmack

+0

भावी पाठकों के लिए, कृपया नीचे @SQLPhil का उत्तर देखें। माइक्रोसॉफ्ट बुक्स ऑनलाइन के आधार पर, SQL सर्वर का भविष्य संस्करण 'INSERT', 'UPDATE', या' DELETE' कथन के लिए' सेट ROWCOUNT' का सम्मान नहीं करेगा। इसके बजाय 'TOP' वाक्यविन्यास का उपयोग करने के लिए सबसे अच्छा। – jklemmack

0

एक सामान्य जवाब तालिका ड्रॉप और इसे फिर से बनाने के लिए, कि एक अच्छा प्रदर्शन कर समाधान है विलोपन shouldn है, लेकिन जब तक आप सत्यापित करने के लिए चलाता या अखंडता की कमी का एक बहुत है पूर्ण तालिका

+0

और यदि आप ड्रॉप कर रहे हैं, तो प्रक्रियाओं, कार्यों, विचार आदि पर निर्भर होने पर क्या होता है? आप उन्हें किसी भी अच्छे कारण के लिए अमान्य कर देंगे। – Ben

1

के लिए लागू होता है, वह महंगी एक ऑपरेशन नहीं होगी।

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

1

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

+1

रसेल। ऐसे कई कारण हो सकते हैं कि आप दस लाख रिकॉर्ड क्यों लोड करेंगे; आप कच्चे डेटा को छोड़ने से पहले गणना करना और गणना मूल्यों को स्टोर करना चाहते हैं। लेकिन आपके पास एक अच्छा मुद्दा है, उचित डिजाइन महत्वपूर्ण है। – Leons

4

सेट पंक्ति गणना विकल्प का उपयोग करके अपनी हटाई गई प्रभावित पंक्तियों की संख्या को सीमित करने और फिर एक लूप प्रदर्शन करना बहुत अच्छा है (और मैंने इसे कई बार पहले उपयोग किया है), ध्यान रखें कि SQL 2012 के बाद से यह नहीं होगा एक विकल्प बनें (BOL देखें)।

इसलिए, दूसरा विकल्प शीर्ष खंड का उपयोग करके हटाए जा रहे पंक्तियों की संख्या को सीमित करने के लिए हो सकता है। यानी

SELECT 1 

WHILE @@ROWCOUNT > 0 
BEGIN 
    DELETE TOP (#) 
    FROM mytable 
    [WHERE ...] 
END 
संबंधित मुद्दे