2012-05-02 11 views
7

हमारे पास हमारे डेटाबेस में एक संग्रहीत प्रोसेडर है जो एक शर्त के साथ 30 कॉलम पर 2 टेबल में शामिल होकर एक तालिका अपडेट करता है। एसक्यूएल सामान्य प्रारूप में है:कई कॉलम अपडेट-कई-आईएसएनयूएलएल के साथ जुड़ने में काफी समय लगता है?

UPDATE Target 
SET col1 = Source.col1 
INNER JOIN Source 
on 
ISNULL(Target.Col2, '') = ISNULL(Source.Col2, '') and 
ISNULL(Target.Col3, '') = ISNULL(Source.Col3, '') and 
. 
. 
. 
ISNULL(Target.Col31, '') = ISNULL(Source.Col31, '') and 

यहां प्रश्न योजना है। इसे अपने पीसी पर सहेजें और इसे फिर से खोलें ताकि यह बेहतर हो सके।

enter image description here

स्रोत तालिका 65m रिकॉर्ड, लक्ष्य 165m है। पहले यह काफी कुछ मिनटों में चलाने के लिए प्रयोग किया जाता था। इस सवाल को ध्यान में रखते हुए कि कितनी बदसूरत और संभावित रूप से अक्षम है, मुझे यह आश्चर्यजनक लगता है। इस महीने यह 1.5 घंटे तक चला, प्रोसेसर का 100% इस्तेमाल किया और हमें इसे मारना पड़ा।

कोई सुझाव नीचे दिए गए प्रश्न को कैसे सुधारें और इसे समय पर कैसे चलाएं ..?

हमारे पास 30-कॉलम स्थिति में उपयोग किए गए कुछ कॉलम पर एकल कॉलम इंडेक्स हैं।

मुझे ISNULL फ़ंक्शन पता है और 30 कॉलम पर शामिल होना पागल है और यह एक खराब डिज़ाइन है। मुझे दोष मत दो, मैंने इस अर्थव्यवस्था को विरासत में मिला।

दुर्भाग्यवश फिर से डिज़ाइन के लिए कोई समय नहीं है। कोई सुझाव?

+4

पिछले महीने से क्या बदल गया? –

+2

सभी एनयूएलएल को '' '' पर अपडेट करें, फिर आईएसएनयूएलएल के बिना क्वेरी चलाएं। लेकिन रीमस का सवाल बहुत प्रासंगिक है, उस अवधि में * क्या * बदल गया है? – MatBailie

+1

क्या आपने इसे मर्ज के रूप में पुनः लिखने पर विचार किया है? क्या आपने 60 आईएसएनयूएलएल कॉल को खत्म करने के लिए उन स्तंभों को गैर-शून्य बनाने पर विचार किया है? –

उत्तर

5
  1. अनुमानित निष्पादन योजना का एक स्क्रीनशॉट पोस्ट करें
  2. मुझे लगता है कि पहले से क्वेरी एक हैश में शामिल होने के लिए प्रयोग किया जाता है (जो यह होना चाहिए), लेकिन किसी भी तरह प्रमुखता आकलन गलत यह अब है और आप एक पाश में शामिल होने से मिलता है। यह देखने के लिए कि क्या यह ठीक है (INNER HASH JOIN) यह देखने के लिए एक हैश को संकेत पर संकेत दें। एक बार हमारे पास सही योजना हो जाने के बाद हम और कह सकते हैं।
  3. समानता को (A1 = A2 OR (A1 IS NULL AND A2 IS NULL)) पर बदलें। एसक्यूएल सर्वर वास्तव में इस पैटर्न को पहचानता है और इसे "बेवकूफ नल अर्थशास्त्र के बिना सटीक बराबर" में परिवर्तित करता है। आप इंडेक्स को उस तरह से शून्य मानों के साथ भी खोज सकते हैं।

यदि यह मदद नहीं करता है, तो चरण (3) करना सुनिश्चित करें और col1-col31 पर col1 सहित कवरेज इंडेक्स बनाएं। इससे आपको विलय मिल जाएगा जो इस मामले में सबसे प्रभावी योजना है। यह वास्तव में तेज़ है। चेतावनी: यह तालिका के ऑन-डिस्क आकार को दोगुना कर देगा और अपडेट धीमा कर देगा।

+1

मैंने योजना को जोड़ा।मेरी संशोधित पोस्ट देखें। ISNULL फ़ंक्शन को हटाने के बारे में आपकी टिप्पणी के बारे में, क्या होगा यदि ए 1 या ए 2 शून्य है लेकिन दोनों नहीं? – ChadD

+0

हाँ एक हैश संकेत में शामिल हो जाएगा इसे ठीक करेगा। – usr

+0

@usr क्वेरी में से कोई एक कैसे जोड़ें? –

0

डीबीए ने सुझाव दिया कि हम सभी 30 कॉलम के साथ एक इंडेक्स जोड़ने के लिए क्वेरी एनालिटर की सिफारिश का पालन करें, अधिकांश "शामिल" कॉलम थे। इसने क्वेरी को पूरा करने की अनुमति दी। अगले महीने जब हम भाग गए, वही अपडेट एसक्यूएल जो आमतौर पर 1.5 घंटों में चलता है 24 घंटों में पूरा नहीं हुआ। जब हम अद्यतन आंकड़े चलाते थे, तो यह एक घंटे में समाप्त हो गया।

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