SQL सर्वर के लिए हटाएँ गति में सुधार


12

हमारे पास विशाल उत्पादन डेटाबेस है, इसका आकार लगभग 300GB है। क्या डिलीट क्वेरी के प्रदर्शन को बेहतर बनाने के लिए कोई दृष्टिकोण है? अभी विलोपन की गति 1-10k प्रति मिनट के बीच है, यह हमारे लिए बहुत धीमी है।


2
प्रति मिनट 1000 पंक्तियाँ बेहद धीमी लगती हैं। क्या आप अवरुद्ध अनुभव कर रहे हैं? या यह पंक्तियों का चयन करने के लिए भी धीमा है, जो सूचकांक की आवश्यकता का सुझाव देगा?
जेम्स जेड

संभवतः आपको अपने हटाए गए मानदंड को कवर करने के लिए सूचकांक बनाना होगा।
गिंडेन

6
उत्तर देने के लिए पर्याप्त विवरण नहीं हैं। आप कौन सी क्वेरी निष्पादित करते हैं? क्या आपके पास शामिल मानदंड कॉलम (यदि कोई हो) पर अनुक्रमित हैं? क्या आपके पास हटाने के लिए ट्रिगर हैं? ...
सेबास्टियन सेवरीन

3
क्या आप एक बार में एक अरब पंक्तियों को हटाने की कोशिश कर रहे हैं? क्या यह संभव है कि आप ऑटोग्रो के बाद ऑटोग्रॉ का इंतजार कर रहे हैं? (यह संभावना से अधिक है कि यह लॉग गतिविधि है जिस पर आप प्रतीक्षा कर रहे हैं, वास्तविक डिलीट गतिविधि नहीं।) इस लेख को देखें ...
हारून बर्ट्रेंड

3
इसके अलावा। किसी भी विदेशी प्रमुख बाधाओं? कृपया पूर्ण तालिका परिभाषा, क्वेरी और निष्पादन योजना प्रदान करें।
मार्टिन स्मिथ

जवाबों:


20

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

  1. सुनिश्चित करें कि आपका लॉग पर्याप्त रूप से आकार का है ताकि वृद्धि की घटनाएं आपको धीमा न करें। चूक के साथ आपका लॉग 10% की वृद्धि के साथ 1MB पर शुरू हो रहा है। ग्रोथ इवेंट्स महंगे हैं, और यदि आप 10 जीबी डिलीट भी लॉग इन कर रहे हैं, तो यह न केवल अभी बल्कि भविष्य में भी प्रदर्शन को नष्ट कर देगा (ऐसा वीएलएफ के कारण होता है)।
  2. यदि आप पूरी तालिका को हटा रहे हैं, तो उपयोग करें TRUNCATEऔर DROP/ CREATE
  3. यदि आप अधिकांश तालिका को हटा रहे हैं SELECT INTO, तो उस डेटा को रखने के लिए उपयोग करें जिसे आप किसी अन्य तालिका में रखना चाहते हैं TRUNCATE, फिर छोटे हिस्से को वापस ले जाएं। (या पुरानी तालिका को छोड़ दें, नया नाम बदलें, और बाधाओं / अनुमतियों को फिर से लागू करें आदि)
  4. पहली बार में डेटा को एक बार में हटाने के बजाय लॉगिंग के प्रभाव को कम करें। इस लेख को देखें । आप अस्थायी रूप से साधारण पुनर्प्राप्ति पर स्विच करने पर भी विचार कर सकते हैं, ताकि आपको केवल CHECKPOINTलॉग बैकअप लेने के बजाय लॉग को साफ़ करना पड़े , लेकिन आपको इसे वापस सेट करने और लॉग चेन को फिर से शुरू करने के लिए एक नया पूर्ण बैकअप लेने की आवश्यकता है ।

+1, एक उत्कृष्ट लेख के लिए मुझसे। इससे मुझे पिछले दिनों हमारे डेवलपर्स को डिलीट ऑपरेशन को समझने में मदद मिली जब वे सिर्फ लॉग फाइल में सुस्ती और विकास के लिए हमारे पास पहुँचते रहे।
KASQLDBA

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

3
@ अनुक्रमणिका को छोड़ने के लिए भी लॉग इन करना पड़ता है (जैसा कि इसे बनाता है), इसलिए यह सिर्फ एक बात हो सकती है कि आप उस लागत का भुगतान कब करना चाहते हैं। परीक्षण के बिना, मुझे यकीन नहीं है कि डिलीट परिदृश्य के लिए एक बड़ा फायदा है (जैसे कि डालने / अपडेट के लिए होगा), जब तक कि आपके पास अनुक्रमित नहीं हैं, आप बाद में रखने वाले नहीं हैं।
हारून बर्ट्रेंड

क्या FK बाधाओं की अस्थायी अक्षमता क्वेरी में सुधार कर सकती है?
लेव जेड

3

कुछ संकेत हैं, लेकिन आप किस संस्करण का उपयोग कर रहे हैं? क्या यह उद्यम संस्करण है? वैसे भी:

  1. यदि आप कर सकते हैं, तो लेन-देन लॉग को तेज डिस्क पर ले जाएं
  2. जहां का विश्लेषण करें । क्या यह हटाने के लिए रिकॉर्ड की पहचान करने के लिए एक सूचकांक का उपयोग करेगा? यदि नहीं, तो क्या आप एक सूचकांक जोड़ सकते हैं?
  3. क्या आपके पास टेबल पर कोई इंडेक्स है जिसे आप छोड़ सकते हैं? यदि हाँ, तो उन्हें छोड़ दें।
  4. क्या आपके पास इस तालिका में विदेशी कुंजी है? ये वास्तव में आपके डिलीट को धीमा कर सकते हैं।
  5. यदि आपके पास एक एंटरप्राइज़ संस्करण है और अड़चन डिस्क IO है, तो पंक्ति स्तर पर एक संपीड़न, आपको अपने डेटा से थोड़ी मदद (या नहीं,) दे सकता है
  6. क्या आप टेबल का विभाजन कर सकते हैं? स्थानीय सूचकांक और विभाजन की गिरावट तेज हो सकती है।
  7. गतिविधि मॉनीटर के माध्यम से कहां अड़चन है, इसकी जांच करें।

विवरण जोड़ें, जब आप बड़े डेटाबेस के साथ काम करते हैं तो एक भी मान्य उत्तर नहीं होता है।


0

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

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

आगे बढ़ने के लिए, आपको बड़ी मात्रा में ऑपरेशन को विखंडू में तोड़ने के लिए संदर्भित करेगा


0

यदि बड़ी तालिका में पुनरावर्ती विदेशी कुंजी है, तो डिलीट धीमा हो सकता है।

यदि ऐसा है, तो उपयुक्त समय ढूंढें, निर्भरता सेवाओं को अक्षम करें, पुनरावर्ती विदेशी कुंजी को अक्षम करें, बड़े पैमाने पर हटाएं प्रदर्शन करें, फिर विदेशी कुंजी को फिर से पुनर्स्थापित करें।


यह वास्तव में मेरा मामला था। यह गर्भनिरोधक को निष्क्रिय करने के लिए थोड़ा जोखिम भरा है, लेकिन डिलीट 1 पंक्ति / seocnd से 500 / सेकंड तक चला गया
Jurion

0

कुछ और बिंदुओं को जोड़ना ...

  1. यह जाँचने का प्रयास करें कि क्या विधेय का सूचकांक इस पर है और आँकड़े भी देखें।
  2. यदि आप बड़ी संख्या में पंक्तियों को हटा रहे हैं और आप अस्थायी तालिका विकल्प भी नहीं चाहते हैं। tablockविकल्प के लिए जाएं ।
  3. देखें कि क्या आपके पास कोई ट्रिगर है, विशेष रूप से ट्रिगर हटाने के बाद।

अधिक सहायता प्राप्त करने के लिए, आपके द्वारा उपयोग की जा रही क्वेरी, तालिका जानकारी और किसी भी अवरुद्ध जानकारी को पोस्ट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.