2012-03-26 10 views
8

प्रदर्शन के लिए बड़े डेटा सेट के लिए कौन सा विकल्प बेहतर होगा?केस बनाम एकाधिक अद्यतन क्वेरी - प्रदर्शन

एक केस स्टेटमेंट या व्यक्तिगत अपडेट क्वेरी का उपयोग कर?

मामला उदाहरण:

UPDATE tbl_name SET field_name = 
CASE 
    WHEN condition_1 THEN 'Blah' 
    WHEN condition_2 THEN 'Foo' 
    WHEN condition_x THEN 123 
    ELSE 'bar' 
END AS value 

व्यक्तिगत क्वेरी उदाहरण:

UPDATE tbl_name SET field_name = 'Blah' WHERE field_name = condition_1 
UPDATE tbl_name SET field_name = 'Foo' WHERE field_name = condition_2 
UPDATE tbl_name SET field_name = 123 WHERE field_name = condition_x 
UPDATE tbl_name SET field_name = 'bar' WHERE field_name = condition_y 

नोट: के बारे में 300,000 रिकॉर्ड अपडेट जा रहे हैं और मामले बयान 10,000 के बारे में जब स्थिति होगा। यदि व्यक्तिगत प्रश्नों का उपयोग करना है तो यह लगभग 10,000 के साथ-साथ

+2

"यदि व्यक्तिगत प्रश्नों का उपयोग करना लगभग 10,000 है" - शायद एक जुड़ा हुआ temp तालिका बेहतर विचार होगा .... –

+0

+1 मिच ... जब मैंने अपना जवाब लिखा था तो दायरे को नहीं देखा। सिद्धांत में 'केस' अधिक कुशल होगा लेकिन शायद उस पैमाने पर नहीं। – JNK

+0

दिलचस्प मैंने इस दृष्टिकोण के बारे में सोचा नहीं था, धन्यवाद –

उत्तर

13

CASE संस्करण है।

ऐसा इसलिए है क्योंकि एक अच्छा मौका है कि आप एक ही पंक्ति को व्यक्तिगत विवरणों के साथ एक से अधिक बार बदल रहे हैं। यदि पंक्ति 10 में condition_1 और condition_y दोनों हैं तो इसे दो बार पढ़ने और बदलने की आवश्यकता होगी। यदि आपके पास क्लस्टर्ड इंडेक्स है तो इसका मतलब है कि संशोधित किए गए अन्य फ़ील्ड (जो) के शीर्ष पर दो क्लस्टर इंडेक्स अपडेट थे।

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

मैं के बारे में एक साल पहले कि अनुक्रम में UPDATE बयान के दर्जनों इस्तेमाल किया CASE साथ UPDATE के बाद से एक का उपयोग करने के लिए और प्रसंस्करण समय के बारे में 80% गिरा दिया इसी तरह की प्रक्रिया बदल दिया है।

0

ऐसा लगता है कि पहले विकल्प पर SQL सर्वर केवल एक बार और प्रत्येक पंक्ति के लिए तालिका के माध्यम से जाएगा, यह स्थिति का मूल्यांकन करेगा।

दूसरे पर, यह सब मेज के माध्यम से जाना 4 बार

तो, 1000 पंक्तियों के साथ एक मेज के लिए, सबसे अच्छा स्थिति पर पहला विकल्प पर हम बात कर रहे हैं लगभग 1000 मूल्यांकन और सबसे खराब स्थिति है, 3000. दूसरे पर हमारे पास हमेशा 4000 मूल्यांकन होंगे

तो विकल्प 1 तेज़ होगा।

0

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

इस तरह आप अपने अद्यतन बयान (कम या ज्यादा) हो जाता है:

UPDATE tbl_name SET field_name = COALESCE((SELECT value FROM temp_tbl WHERE tbl_name.conditional_field = temp_tbl.condition_value), field_name), 
    field_name2 = COALESCE((SELECT value FROM temp_tbl2 WHERE tbl_name.conditional_field2 = temp_tbl2.condition_value), field_name2) 

और इतने पर ..

यह जबकि एक बार में अपडेट की बड़ी मात्रा के लिए स्केलिंग आप अच्छा प्रदर्शन देना चाहिए।

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