निम्न क्वेरी LastModifiedTime कॉलम पर एक सूचकांक पर एक सूचकांक की तलाश का उपयोग करता है।इंडेक्स खोज बनाम क्लस्टर्ड इंडेक्स स्कैन - स्कैन क्यों चुना जाता है?
SELECT
CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE a.LastModifiedTime BETWEEN '3/3/2010' And '3/4/2010'
AND a.SubAssembly = '400'
नीचे दिए गए क्वेरी, जो ऊपर क्वेरी के लगभग समान है, LastModifiedTime पर सूचकांक के बजाय, संकुल अनुक्रमणिका स्कैन का उपयोग करता है। क्या कोई मुझे बता सकता है क्यों? और, सबसे महत्वपूर्ण बात यह है कि SQL सर्वर को इंडेक्स संकेत का उपयोग करते हुए के बिना LastModifiedTime कॉलम, पर इंडेक्स का उपयोग करने के लिए क्या कर सकता है।
Declare @LastModifiedTimeEnd dateTime
Declare @LastModifiedTimeStart dateTime
SELECT
CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd
AND a.SubAssembly = '400'
मैं उलझन में हूं कि क्वेरी प्लानर क्लस्टर सूचकांक को क्यों मान लेगा बेहतर है। पैरामीटर के बावजूद, यह अभी भी एक विशिष्ट कॉलम के खिलाफ मेल खाता है जिसके लिए एक इंडेक्स बनाया गया है। उस सूचकांक का बिंदु क्या है यदि इसका उपयोग केवल निश्चित पैरामीटर के साथ किया जाता है? –
@Kent: मानों की एक श्रृंखला को पुनर्प्राप्त करने के लिए एक द्वितीयक अनुक्रमणिका का उपयोग करने से सूचकांक को तालिका में वापस शामिल करने की आवश्यकता होती है। जब सीमा बड़ी होती है, तो ओवरहेड में शामिल होने से सॉर्टिंग ओवरहेड से अधिक होता है। – Quassnoi
मुझे लगता है - धन्यवाद। मान लीजिए कि मुझे लगता है कि पैरामीटर स्नीफिंग डिफ़ॉल्ट व्यवहार होगा। संभावित रूप से '> = @LastModifiedTimeStart और <= LastModifiedTimeEnd' का उपयोग करके 'विकल्प (रिकॉम्पली)' निर्दिष्ट किए बिना गैर-क्लस्टर इंडेक्स के उपयोग को रोक दिया जाएगा। –