इसे हैश किया गया है और फिर से हैश किया गया है। टिप मैंने टिप्पणी में इंगित की और लिंक और स्पष्टीकरण @xQbert ऊपर पोस्ट किया गया, अनुरोध द्वारा यहां एक सबक्वायरी का उपयोग करके COALESCE बनाम ISNULL का स्पष्टीकरण दिया गया है। आइए इन दो प्रश्नों पर विचार करें, जो परिणामों के संदर्भ में समान हैं:
SELECT COALESCE((SELECT TOP (1) name FROM sys.objects), N'foo');
SELECT ISNULL((SELECT TOP (1) name FROM sys.objects), N'foo');
(बिना ORDER BY /dev/null/ धन्यवाद के TOP का उपयोग करने के बारे में टिप्पणियाँ।)
COALESCE मामले में, तर्क वास्तव में कुछ इस तरह विस्तारित हो जाता है:
SELECT CASE WHEN (SELECT TOP (1) ...) IS NULL
THEN (SELECT TOP (1) ...)
ELSE N'foo'
END
ISNULL के साथ ऐसा नहीं होता है। एक आंतरिक अनुकूलन है जो यह सुनिश्चित करता है कि सबक्वायरी का मूल्यांकन केवल एक बार किया जाता है। मुझे नहीं पता कि माइक्रोसॉफ्ट के बाहर किसी को यह पता है कि यह अनुकूलन कैसे काम करता है, लेकिन यदि आप योजनाओं की तुलना करते हैं तो आप ऐसा कर सकते हैं। यहाँ COALESCE संस्करण की योजना है:
और यहाँ ISNULL संस्करण की योजना है - ध्यान दें कि यह कितना सरल है (और स्कैन केवल एक बार होता है):
COALESCE मामले में स्कैन दो बार होता है। मतलब सबक्वेरी का दो बार मूल्यांकन किया जाता है, भले ही वह कोई परिणाम न दे। यदि आप एक WHERE क्लॉज जोड़ते हैं जैसे कि सबक्वेरी 0 पंक्तियाँ उत्पन्न करती है, तो आपको समान असमानता दिखाई देगी - योजना के आकार बदल सकते हैं, लेकिन फिर भी आपको COALESCE केस के लिए एक डबल सीक + लुकअप या स्कैन दिखाई देगा। थोड़ा अलग उदाहरण यहां दिया गया है:
SELECT COALESCE((SELECT TOP (1) name FROM sys.objects
WHERE name = N'no way this exists'), N'foo');
SELECT ISNULL((SELECT TOP (1) name FROM sys.objects
WHERE name = N'no way this exists'), N'foo');
इस बार COALESCE संस्करण की योजना - फिर से आप पूरी शाखा देख सकते हैं जो सबक्वेरी दोहराए गए शब्दशः का प्रतिनिधित्व करती है:
और फिर से एक बहुत ही सरल योजना, ISNULL का उपयोग करते हुए लगभग आधा काम कर रही है:
कुछ और चर्चाओं के लिए आप इस प्रश्न को dba.se पर भी देख सकते हैं:
मेरा सुझाव यह है (और आप मेरे कारणों को टिप और उपरोक्त प्रश्न में देख सकते हैं):भरोसा करें लेकिन सत्यापित करें। मैं हमेशा COALESCE का उपयोग करता हूं (क्योंकि यह ANSI मानक है, दो से अधिक तर्कों का समर्थन करता है, और डेटा प्रकार की प्राथमिकता के साथ भद्दा चीजें नहीं करता है) जब तक मुझे पता है कि मैं अभिव्यक्तियों में से एक के रूप में एक सबक्वायरी का उपयोग कर रहा हूं (जो मुझे इस तरह के सैद्धांतिक काम के बाहर कभी याद नहीं है) या मैं एक वास्तविक प्रदर्शन समस्या का सामना कर रहा हूं और यह देखने के लिए तुलना करना चाहता हूं कि क्या COALESCE बनाम ISNULL में कोई है पर्याप्त प्रदर्शन अंतर (जो सबक्वेरी मामले के बाहर, मुझे अभी तक नहीं मिला है)। चूंकि मैं लगभग हमेशा डेटा प्रकारों के तर्कों के साथ COALESCE का उपयोग कर रहा हूं, इसलिए मुझे अतीत में इसके बारे में जो कुछ भी कहा गया है उसे देखने के अलावा मुझे शायद ही कभी कोई परीक्षण करना पड़ता है (मैं एस्पफ़ाक लेख जिसे xQbert ने बतायाए> , 7 साल पहले)।