COALESCE बनाम ISNULL के लिए प्रदर्शन अंतर?


48

मैंने देखा है कि बहुत से लोग ISULL के स्थान पर COALESCE फ़ंक्शन का उपयोग करते हैं। इंटरनेट खोजों से, मैंने पाया है कि COALESCE ANSI मानक है, इसलिए एक फायदा है कि हम जानते हैं कि इसका उपयोग करते समय क्या उम्मीद की जाती है। हालाँकि, ISNULL पढ़ने में आसान लगता है क्योंकि यह अधिक स्पष्ट है कि यह क्या कर रहा है।

मुझे यह भी एहसास है कि ISNULL एक तरह से मुश्किल है क्योंकि यह अलग-अलग डेटाबेस सर्वर पर और अलग-अलग भाषाओं में अलग-अलग काम करता है।

यह सब, मेरे दिमाग में, शैली और मानकों को उबालता है। यह देखते हुए कि शैली व्यक्तिपरक है, क्या ISNULL (या इसके विपरीत) पर COALESCE का उपयोग करने का कोई कारण है? विशेष रूप से, क्या एक के बाद एक प्रदर्शन का लाभ है?


1
मैंने किसी भी उत्तर में उल्लेख नहीं किया है कि एक उप क्वेरी COALESCE दो बार मूल्यांकन में मिलती है।
मार्टिन स्मिथ

4
"ISNULL पढ़ने में आसान लगता है क्योंकि यह अधिक स्पष्ट लगता है कि यह क्या कर रहा है" - वास्तव में? मुझे यह नाम काउंटर-अनइंस्टीट्यूट लगता है: मैं यह उम्मीद करता हूं कि यह एक बूलियन को लौटाएगा, जो दर्शाता है कि एक अभिव्यक्ति अशक्त या अज्ञात है। नाम COALESCEमहज
एकतरफा

जवाबों:


26

COALESCEआंतरिक रूप से एक CASEअभिव्यक्ति के लिए अनुवादित है , ISNULLएक आंतरिक इंजन फ़ंक्शन है।

COALESCEएक ANSI मानक फ़ंक्शन है, ISNULLT-SQL है।

निष्पादन अंतर तब हो सकता है और तब हो सकता है जब विकल्प निष्पादन योजना को प्रभावित करता है लेकिन कच्चे कार्य की गति का अंतर न्यूनतम होता है


40
  • ISNULL Sybase / SQL सर्वर विशिष्ट है
  • COALESCE पोर्टेबल है

फिर

  • ISNULL 2 तर्क ले
  • COALESCE 1-n तर्क लेता है

अंत में, और मजेदार सा। परिणाम डेटाटाइप और लंबाई / परिशुद्धता / स्केल

यह अंतिम बिट इसीलिए है क्योंकि ISNULL का आमतौर पर उपयोग किया जाता है क्योंकि यह अधिक अनुमानित है (?) और COALESCE अनपेक्षित डेटा प्रकार रूपांतरण जोड़ सकता है: जो कि "यह धीमा है" बिट से आता है

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

सभी डेटाटिप्स समान होने के कारण, आपको कोई व्यावहारिक अंतर नहीं दिखेगा ...


22

जैसा कि मार्क ने बताया, आप प्रदर्शन अंतर खोजने के लिए कड़ी मेहनत करने जा रहे हैं; मुझे लगता है कि अन्य कारक अधिक महत्वपूर्ण होंगे। मेरे लिए, मैं हमेशा COALESCE का उपयोग करता हूं , और इसमें से अधिकांश का उल्लेख आप या मार्क पहले ही कर चुके हैं:

  • COALESCE ANSI मानक है। अगर मैं अपना कोड पोर्ट करने जा रहा हूं तो मुझे एक चिंता की बात है। मेरे लिए व्यक्तिगत रूप से यह उतना महत्वपूर्ण नहीं है, क्योंकि मुझे पता है कि सेलको की कक्षा की दुनिया के बाहर ऐसे बंदरगाह वास्तव में कितने भिन्न हैं, लेकिन कुछ लोगों के लिए यह एक लाभ है।
  • पठनीयता के बारे में आपने जो कहा है, उसके विपरीत, मुझे लगता है कि ISNULL को पढ़ना मुश्किल हो सकता है विशेष रूप से अन्य भाषाओं या प्लेटफार्मों से आने वाले उपयोगकर्ताओं के लिए जहां ISNULL एक बूलियन देता है (जो SQL सर्वर में मौजूद नहीं है)। दी गई, वर्तनी कठिन है, लेकिन कम से कम यह गलत धारणाओं को जन्म नहीं देता है।
  • COALESCE बहुत अधिक लचीला है, जैसा कि मैं कह सकता हूं कि COALESCE (a, b, c, d) जबकि ISNULL के साथ मुझे एक ही चीज़ प्राप्त करने के लिए बहुत सारे नेस्टिंग करने होंगे।

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

ध्यान दें

एक अपवाद है। इन्हें SQL सर्वर के वर्तमान संस्करणों में अलग तरीके से संभाला जाता है:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

COALESCEसंस्करण वास्तव में निष्पादित करेंगे some_aggregate_query(मूल्य की जांच करने के लिए एक बार, और एक बार यह वापस जाने के लिए जब गैर शून्य) दो बार है, जबकि ISNULLकेवल सबक्वेरी एक बार निष्पादित करेंगे। मैं यहां कुछ अन्य मतभेदों के बारे में बात करता हूं:

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