2011-11-14 13 views
7

मैं SQL सर्वर 2008 का उपयोग कर रहा हूं। मेरे पास डेटटाइम कॉलम "डेटफ्रॉम" पर एक गैर-अनन्य गैर-क्लस्टरेड इंडेक्स है। मैं इस कॉलम के आधार पर टेबल खोज रहा हूं।खोज करते समय INDEX पर CONVERT() का क्या प्रभाव है?

Query1: 
SELECT * 
FROM myTable 
WHERE CONVERT(VARCHAR(10),DateFrom,23) >= '2011-01-01' 

Query2: 
SELECT * 
FROM myTable 
WHERE DateFrom >= '2011-01-01 00:00:00.000' 

मैं & कोई अंतर नहीं पाया जाँच की है: मैं बस पता करने के लिए नीचे देखें सूचकांक पर CONVERT() फ़ंक्शन का असर चाहता था। लेकिन मैं सोच रहा था कि कॉलम कनवर्ट किया गया है, इसलिए एसक्यूएल सर्वर द्वारा इंडेक्स का उपयोग नहीं किया जा सकता है, क्या यह सही है?

कृपया मुझे क्षमा करें, अगर यह एक उचित सवाल नहीं है।

+0

o.DateFrom - ओ-मामूली टाइपो के लिए कोई उपनाम नहीं है? – Andrew

+0

* मैंने जांच की है और कोई फर्क नहीं पाया * - क्या आप कह रहे हैं कि आप वास्तव में निष्पादन योजनाओं की तुलना करते हैं और उन्हें समान पाते हैं? मुझे शक है कि; पहली क्वेरी स्ट्रिंग्स के नियमों का उपयोग करके तारों की तुलना करती है, दूसरी तुलना तिथियां। – GSerg

+0

यदि आप 2008 में हैं और 'डेटटाइम' को 'डेट' पर कास्टिंग करते हैं, तो यह अभी भी एक इंडेक्स का उपयोग कर सकता है लेकिन यह नियम के लिए अपवाद है। –

उत्तर

10

आम तौर पर, जब आपके पास WHERE क्लॉज की तुलना के बाईं ओर फ़ंक्शन होता है, तो सर्वर संदर्भित कॉलम पर इंडेक्स का उपयोग करने में असमर्थ होगा।

आपके पहले उदाहरण में, डेटफ्रम कॉलम से सीधे तुलना नहीं की जाती है। इसके बजाय, आप कॉलम पर एक फ़ंक्शन का उपयोग कर रहे हैं। जब सर्वर इसे विस्तारित करता है, तो उसे प्रत्येक कॉलम मान पर फ़ंक्शन निष्पादित करना होगा, और परिणामी मान अनुक्रमित नहीं है। इसलिए, क्वेरी को बेहतर बनाने के लिए कोई अनुक्रमणिका का उपयोग नहीं किया जा सकता है।

इसके अलावा, आपके पहले उदाहरण में, आपने संकेत दिया कि डेटफ्रम कॉलम एक डेटाटाइम कॉलम है। फिर भी, आप कॉलम को एक स्ट्रिंग में परिवर्तित कर रहे हैं और एक स्ट्रिंग तुलना कर रहे हैं। इसलिए, सर्वर आपके डेटाटाइम इंडेक्स का उपयोग नहीं करेगा।

अपने दूसरे उदाहरण में, आप निरंतर मान को सीधे कॉलम के साथ तुलना कर रहे हैं, इसलिए सर्वर इंडेक्स का उपयोग कर सकता है। सर्वर तुलनात्मक दाहिने तरफ स्ट्रिंग स्थिरांक को डेटाटाइम मान में परिवर्तित करेगा। हालांकि, यह सभी मामलों में सूचकांक का उपयोग नहीं करेगा। उदाहरण के लिए, यदि आपके पास पंक्तियों की बहुत कम संख्या है, तो सर्वर इंडेक्स का उपयोग न करने और बस कुछ पंक्तियों को स्कैन करने का निर्णय ले सकता है।

दोनों प्रश्न एक ही परिणाम सेट प्राप्त कर सकते हैं, लेकिन वे अभी भी बहुत अलग हैं।

+0

धन्यवाद, मुझे इसे बड़े डेटा पर आज़माएं। –

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