2011-09-19 23 views
11

कोड विश्लेषण नियम SR0007 कहा गया है कि:ISNULL कारण तालिका स्कैन में निरर्थक कॉलम लपेटता है? विजुअल स्टूडियो 2010 डेटाबेस परियोजनाओं के लिए

आप स्पष्ट रूप से इंगित करना चाहिए कि प्रत्येक स्तंभ है कि एक IsNull समारोह में एक शून्य मूल्य शामिल कर सकते हैं रैप करके तुलना भाव में शून्य मानों का प्रबंधन कैसे।

हालांकि कोड विश्लेषण नियम SR0006 उल्लंघन किया जाता है जब:

किसी तुलना के भाग के रूप में, एक अभिव्यक्ति एक स्तंभ संदर्भ ... आपका कोड अगर यह एक अभिव्यक्ति है, जो तुलना एक मेज स्कैन का कारण बन सकता शामिल एक कॉलम संदर्भ।

क्या यह ISNULL पर भी लागू होता है, या ISNULL का कोई तालिका स्कैन नहीं होता है?

उत्तर

17

हां यह टेबल स्कैन का कारण बनता है। (हालांकि कॉलम वास्तव में शून्य नहीं है)

SR0007 नियम बेहद खराब कंबल सलाह है क्योंकि यह भविष्यवाणी करने योग्य नहीं है और इसका मतलब है कि कॉलम पर कोई भी अनुक्रमणिका बेकार होगी। यहां तक ​​कि अगर कॉलम पर कोई इंडेक्स नहीं है, तो भी यह कार्डिनिटी का अनुमान लगा सकता है कि योजना के अन्य हिस्सों को गलत तरीके से प्रभावित किया जा सकता है।

Microsoft.Performance श्रेणी में इसका वर्गीकरण काफी मनोरंजक है क्योंकि ऐसा लगता है कि क्वेरी प्रदर्शन की कोई समझ नहीं है।

यह तर्क का दावा है

अपने कोड दो शून्य मान तुलना या किसी अन्य मूल्य के साथ एक शून्य मूल्य, अपने कोड एक अज्ञात परिणाम वापस आ जाएगी तो है।

एक बार आप समझते हैं कि NULL के साथ किसी भी =, <>, >, < आदि तुलना Unknown के रूप में मूल्यांकन करें और WHERE खंड केवल पंक्तियों जहां रिटर्न कि जबकि अभिव्यक्ति ही unknown अपने कोड एक पूरी तरह से नियतात्मक परिणाम देता है के लिए मूल्यांकन करता है अभिव्यक्ति true का मूल्यांकन करती है।

यह संभव है कि उनका मतलब है कि ANSI_NULLS बंद है लेकिन WHERE ISNULL([c2],0) > 2; बनाम WHERE [c2] > 2; के प्रलेखन में वे उदाहरण इस सेटिंग से प्रभावित नहीं होंगे। यह सेटिंग

एक तुलना को प्रभावित करता है केवल अगर तुलना की ऑपरेंड में से एक या तो एक चर कि शून्य या एक शाब्दिक शून्य है।

निष्पादन स्कैन बनाम की तलाश या

CREATE TABLE #foo 
    (
    x INT NULL UNIQUE 
) 

INSERT INTO #foo 
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID) 
FROM sys.all_columns 

SELECT * 
FROM #foo 
WHERE ISNULL(x, 10) = 10 

SELECT * 
FROM #foo 
WHERE x = 10 

SELECT * 
FROM #foo 
WHERE x = 10 
     OR x IS NULL 

enter image description here

+0

नीचे 'आदेश BY' खंड में है कि वाक्य रचना है क्या दिखा योजना है? (मैंने गुगल किया है लेकिन इसके लिए Google के लिए कुछ मुश्किल है ...) – AakashM

+0

@AakashM - यह संख्याओं का आरोही अनुक्रम प्राप्त करने के क्रम में निरंतर क्रमबद्ध करने के लिए अब तक कम से कम टाइपिंग तरीका है। 'ओवर (ऑर्डर (चयन 0)) 'या' ओवर (@@ spid द्वारा ऑर्डर) 'विकल्प हैं। आप एक शाब्दिक निरंतर मान का उपयोग नहीं कर सकते क्योंकि SQL सर्वर आपको एक त्रुटि देता है। शून्य से विभाजित होने से इसे शाब्दिक स्थिर माना जाता है। आप '1/0' का उपयोग तब SQL सर्वर चीजों के रूप में नहीं कर सकते जो आप एक पूर्णांक कॉलम ordinal द्वारा ऑर्डर करने का प्रयास कर रहे हैं और एक त्रुटि फेंकता है। –

+0

ओह, मैं देखता हूं, '$' को मूल्य शून्य के साथ 'धन' शब्दशः के रूप में व्याख्या किया जाता है! पार्सर से यह आश्चर्यजनक उदारता है, मुझे कहना है :) – AakashM