2008-09-11 6 views
8

संपादित करें: हल किया गया, तालिका पर एक लूप के साथ एक ट्रिगर था (नीचे अपना उत्तर नीचे पढ़ें)।DELETE स्टेटमेंट SQL सर्वर पर किसी स्पष्ट कारण के लिए लटकता है

DELETE FROM tablename WHERE pk = 12345 

यह सिर्फ लटकी हुई है, कोई समय समाप्ति, कोई कुछ भी नहीं:


हम एक सरल हटाने बयान है कि इस तरह दिखता है।

हमने निष्पादन योजना को देखा है, और इसमें यह सुनिश्चित करने के लिए संबंधित तालिकाओं पर कई लुकअप शामिल हैं कि कोई भी विदेशी कुंजी डिलीट की यात्रा नहीं करेगी, लेकिन हमने सत्यापित किया है कि इनमें से किसी भी अन्य तालिका में कोई भी पंक्ति नहीं है विशेष पंक्ति

इस समय डेटाबेस से कोई अन्य उपयोगकर्ता कनेक्ट नहीं है।

हमने इसके खिलाफ डीबीसीसी चेकडबी चलाया है, और यह 0 त्रुटियों की रिपोर्ट करता है।

sp_who और sp_lock जबकि क्वेरी व्यतीत कर रहा है के परिणामों को देखते हुए, मुझे लगता है कि मेरी spid पीएजी और कुंजी ताले के बहुत सारे है, साथ ही कभी-कभी टैब ताला है पर ध्यान दें।

तालिका में 1.777.621 पंक्तियां हैं, और हाँ, पीके प्राथमिक कुंजी है, इसलिए यह सूचकांक के आधार पर एक पंक्ति पंक्ति हटा है। निष्पादन योजना में कोई तालिका स्कैन नहीं है, हालांकि मुझे लगता है कि इसमें कुछ ऐसा है जो टेबल स्पूल (उत्सुक स्पूल) कहता है, लेकिन पंक्तियों की अनुमानित संख्या कहता है 1. क्या यह वास्तव में छिपाने में टेबल-स्कैन हो सकता है? यह केवल कहता है कि यह प्राथमिक कुंजी कॉलम को देखता है।

तालिका पर डीबीसीसी डीब्रेन्डएक्स और अद्यतन सांख्यिकी का प्रयास किया। दोनों उचित समय के भीतर पूरा हो गया।

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

हमें और क्या देखना चाहिए?

ध्यान दें कि इस तालिका में पहले यह समस्या नहीं थी, यह समस्या आज सुस्त हो गई। हमारे पास एक ही टेबल सेटअप (ग्राहक डेटाबेस की प्रतियां) के साथ कई डेटाबेस भी हैं, और वे अपेक्षा के अनुसार व्यवहार करते हैं, यह केवल समस्याग्रस्त है।

उत्तर

4

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

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

3

उस तालिका पर अनुक्रमणिका को पुन: प्रयास करने का प्रयास करें, और आंकड़ों को पुन: उत्पन्न करने का प्रयास करें।

DBCC REINDEX

लापता जानकारी के

UPDATE STATISTICS

1

ठीक है, यह शर्मनाक है।

एक कॉलेग्यू ने कुछ समय पहले उस तालिका में एक ट्रिगर जोड़ा था, और ट्रिगर में एक बग था। यद्यपि उसने बग तय किया था, फिर भी उस तालिका के लिए ट्रिगर को फिर से बनाया नहीं गया था।

तो सर्वर वास्तव में कुछ भी नहीं कर रहा था, यह सिर्फ एक बड़ी संख्या में था।

ओह अच्छा ...

हर किसी के लिए आंखों, जो इस पढ़ सकते हैं और समस्या पर विचार के लिए धन्यवाद।

मैं जोसेफ के जवाब को स्वीकार करने जा रहा हूं, क्योंकि वह निकटतम था, और अप्रत्यक्ष रूप से इस मुद्दे पर कैस्केडिंग डिलीटों के साथ था।

+0

आपने एक लूप का उपयोग न करने के लिए ट्रिगर को ठीक किया है ना? एक ट्रिगर में लगभग कर्सर या लूप नहीं होना चाहिए। – HLGEM