2010-02-18 12 views
21

मैं इन कार्यों के बीच अंतर को समझता हूं लेकिन मेरा सवाल यह है कि एक एकल शून्य मूल्य की जांच करते समय ISNULL को COALESCE का उपयोग करने से कोई तेज होगा? मैंजो तेजी से COALESCE या ISNULL है?

जैसे

COALESCE(SELECT TOP 1 SomeValue FROM SomeTable, 0) 

बनाम

ISNULL(SELECT TOP 1 SomeValue FROM SomeTable, 0) 

उत्तर

3

ISNULL तेजी से हो जाएगा लगता है कि यह खुद के लिए कम समारोह/कोड कार्यान्वयन है क्योंकि से COALESCE

1

यह तेजी से बनाने लिंक की जांच करें ISNULLCOALESCE से अधिक पसंद करते समय पसंद किया गया है कि ISNULL खर्च करता है क्वेरी योजनाएं तैयार करने के लिए जो COALESCE से अधिक कुशल हैं।

  1. ISNULL Vs COALESCE

  2. ISNULL vs COALESCE speed test

  3. कृपया चेक प्रदर्शन: ISNULL vs. COALESCE

+0

पहला लिंक ISNULL को प्राथमिकता देता है, और दूसरा लिंक बताता है कि कोलेस को प्राथमिकता दी जानी चाहिए! – AdaTheDev

+0

कृपया लिंक देखें प्रदर्शन: ISNULL बनाम COALESCE http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx – amexn

11

इस पर एक त्वरित रूप से देखा गया क्योंकि 2 के बीच प्रदर्शन पर कई अलग-अलग तुलनाओं को देखना दिलचस्प है। मुझे लगता है कि this एडम माचैनिक द्वारा ब्लॉग पोस्ट इस विषय पर किए गए प्रदर्शन बेंचमार्किंग में सबसे सटीक है, जहां लब्बोलुआब यह है:

... और IsNull, मैं क्या वह तो रूप में एक ही विचार से सहमत सुंदर लगातार 10 या 12 प्रतिशत की औसत द्वारा COALESCE बाहर प्रदर्शन करने के लिए

हालांकि प्रतीत होता है कहने के लिए चला जाता है - कि अंतर बहुत नगण्य है - उदाहरण के लिए अपने परीक्षणों में, एक लाख निष्पादन औसत 0.7 के अंतर पर दिखाई दिया। यह इसके लायक है? मैं सुझाव दूंगा कि अनुकूलित करने के लिए शायद बड़े क्षेत्र हैं। लेकिन लेख पढ़ें, यह एक अच्छा पढ़ा है।

+2

मेरा वोट "क्या यह है इसके लायक है? मैं सुझाव दूंगा कि शायद अनुकूलित करने के लिए बड़े क्षेत्र हैं "सचमुच कहा। –

+0

"लेकिन यह 6 सेकंड और 5.3 सेकंड के बीच का अंतर है" - मैं कम से कम अपने छोटे उदाहरण में ईमानदार होने के लिए बहुत महत्वपूर्ण कहूंगा। – AaronHolland

6

इस मामले में, ISNULL सबसे अच्छा विकल्प है। चूंकि, SQL सर्वर COALESCE फ़ंक्शन को CASE कथन के रूप में व्याख्या करता है।तो, आपकी क्वेरी

COALESCE (चयन SomeTable से शीर्ष 1 SomeValue, 0)

एसक्यूएल सर्वर द्वारा

  1. मामला
  2. WHEN (चयन टॉप 1 SomeValue रूप SomeTable से लिखा जाएगा) नहीं है
  3. फिर (कुछ शीर्ष 10 से कुछ वैल्यू चुनें)
  4. और के 0
  5. अंत

आप ऊपर व्याख्या दिखाई देती है तो "SomeTable" दो बार स्कैन किया जाएगा। लेकिन ISNULL का मूल्यांकन केवल एक बार किया जाएगा।

+0

COALESCE ऑपरेटर के बारे में दो बार एक ही प्रश्न का मूल्यांकन करने के बारे में एक खुला [माइक्रोसॉफ्ट कनेक्ट मुद्दा] (https://connect.microsoft.com/SQLServer/feedback/details/336002/unnecessly-bad-performance-for-coalesce-subquery) है । – Aaroninus

-2

मैंने अभी अपने स्वयं के डीबी पर एक परीक्षण चलाया। लगभग 700k पंक्तियां।

SELECT COUNT(*) FROM table WHERE COALESCE(field_1,field_2,field_3,field_4) IS NOT NULL 

12106 का परिणाम 56 सेकंड में प्राप्त की।

SELECT COUNT(*) FROM table WHERE field_1 IS NOT NULL OR field_2 IS NOT NULL OR field_3 IS NOT NULL OR field_4 IS NOT NULL 

12106 का परिणाम 0.00 सेकंड में प्राप्त हुआ।

+2

जो isnull() फ़ंक्शन – user314321

+0

@Fraser hmmm, सत्य का परीक्षण नहीं करता है। मैं 'WHERE! ISNULL (field_1) ... के साथ परीक्षण फिर से कर सकता हूं। लेकिन क्या हम यह सुनिश्चित नहीं कर सकते कि 'ISNULL()' पर एक फ़ंक्शन कॉल 'नॉट नल' का उपयोग करने से भी धीमा होगा? –

0

इसके लायक होने के लिए आपके पास एक बहुत ही विशिष्ट उपयोग केस है, इसलिए मैंने आपके वास्तविक प्रश्न का नमूना किसी तालिका पर मूल्य में पहले इस्तेमाल किया था जो अन्य चर के लिए स्क्रिप्ट को नियंत्रित और नियंत्रित करता था। मुझे लगता है कि कुछ औसत एक int था जैसा आपने 0 का उपयोग किया था। मेरा सुझाव यह है कि आप अपना विशिष्ट कुछवल/कुछ मामला चुनते हैं और स्वयं परीक्षण करते हैं।

declare @val int = 0; 
declare @time1 Datetime2 = getdate(); 
declare @time2 Datetime2 = getdate(); 
Select @time1 = GETDATE(); 
while @MyCounter < 1000000 
Begin 
Select @val = ISNULL((SELECT TOP 1 LocationID FROM location), 0) 
Select @MyCounter +=1; 
END 
Select @time2 = GETDATE(); 
Print datediff(millisecond,@time1,@time2); 
Select @MyCounter = 0; 
Select @time1 = GETDATE(); 
while @MyCounter < 1000000 
Begin 
Select @val = COALESCE((SELECT TOP 1 LocationID FROM Location), 0) 
Select @MyCounter +=1; 
END 
Select @time2 = GETDATE(); 
Print datediff(millisecond,@time1,@time2); 

परिणाम बहुत नाटकीय थे, इस्लाम के लिए 11270 और सहवास के लिए 18 9 30 थे। लूप के दूसरे टेस्ट के रूप में लूप के क्रम को उलटकर 18260 को कॉल्सलेस और 10810 के लिए इन्सनल के लिए बनाया गया। आपके विशिष्ट मामले के लिए मैं कहूंगा कि isnull स्पष्ट रूप से तेज़ है।

यह कहना नहीं है कि यह किसी भी अन्य स्थिति में बेहतर है। Int के बजाय सीधे ऊपर मान, या nvarchars या बिट्स का उपयोग करना, या एक स्तंभ जो प्राथमिक कुंजी नहीं है, या नेस्टिंग isnull बनाम को जोड़ने के लिए पैरामीटर जोड़ना चीजों को बदल सकता है।

यह केवल प्रश्न पूछता है जैसा कि पूछा गया था।

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