Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

IsNULL और Coalesce उचित उपयोग

इसे हैश किया गया है और फिर से हैश किया गया है। टिप मैंने टिप्पणी में इंगित की और लिंक और स्पष्टीकरण @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 साल पहले)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ASP.NET साइट में कोड बनाम कॉन्फ़िग फ़ाइल में SQL सर्वर कनेक्शन स्ट्रिंग

  2. टी-एसक्यूएल:मूल्य सूची में मूल्यों का चयन कैसे करें जो तालिका में नहीं हैं?

  3. SQL LIKE क्लॉज में SqlParameter का उपयोग काम नहीं कर रहा है

  4. फ्लोट असंगतता का औसत

  5. SQL सर्वर और C#:अंतिम सम्मिलित आईडी प्राप्त करें