2010-03-05 16 views
8

निम्न क्वेरी 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' 

उत्तर

6

नीचे दिए गए क्वेरी, जो ऊपर क्वेरी के लगभग समान है, LastModifiedTime पर सूचकांक के बजाय, संकुल अनुक्रमणिका स्कैन का उपयोग करता है। क्या कोई मुझे बता सकता है क्यों?

क्वेरी के नीचे पैरामीटर के मान जब योजना बनाना और मानता है कि सामान्य में , संकुल अनुक्रमणिका स्कैन बेहतर है पता नहीं है।

और, अधिक महत्वपूर्ण बात यह है कि मैं क्या एक सूचकांक संकेत का उपयोग किए बिना, 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 @LastModifiedTimeStart And @LastModifiedTimeEnd 
AND a.SubAssembly = '400' 
OPTION (OPTIMIZE FOR (@LastModifiedTimeStart = '3/3/2010', @LastModifiedTimeEnd = '3/4/2010')) 

वैकल्पिक रूप से, आप OPTION (RECOMPILE) है, जो विभिन्न कार्य योजना लागू करके हर बार क्वेरी चलाया जाता है पैदा करेगा जोड़ सकते हैं, खाते (पैरामीटर सूँघने) में पैरामीटर मान लेने।

हालांकि, यह गारंटी नहीं देता है कि सूचकांक का उपयोग किया जाएगा।

+0

मैं उलझन में हूं कि क्वेरी प्लानर क्लस्टर सूचकांक को क्यों मान लेगा बेहतर है। पैरामीटर के बावजूद, यह अभी भी एक विशिष्ट कॉलम के खिलाफ मेल खाता है जिसके लिए एक इंडेक्स बनाया गया है। उस सूचकांक का बिंदु क्या है यदि इसका उपयोग केवल निश्चित पैरामीटर के साथ किया जाता है? –

+0

@Kent: मानों की एक श्रृंखला को पुनर्प्राप्त करने के लिए एक द्वितीयक अनुक्रमणिका का उपयोग करने से सूचकांक को तालिका में वापस शामिल करने की आवश्यकता होती है। जब सीमा बड़ी होती है, तो ओवरहेड में शामिल होने से सॉर्टिंग ओवरहेड से अधिक होता है। – Quassnoi

+0

मुझे लगता है - धन्यवाद। मान लीजिए कि मुझे लगता है कि पैरामीटर स्नीफिंग डिफ़ॉल्ट व्यवहार होगा। संभावित रूप से '> = @LastModifiedTimeStart और <= LastModifiedTimeEnd' का उपयोग करके 'विकल्प (रिकॉम्पली)' निर्दिष्ट किए बिना गैर-क्लस्टर इंडेक्स के उपयोग को रोक दिया जाएगा। –

6

आप sp_create_plan_guide के साथ एक योजना मार्गदर्शिका बना सकते हैं। Optimizing Queries in Deployed Applications by Using Plan Guides देखें। एक प्लान गाइड ऑप्टिमाइज़र को यह तय करने में मदद करेगा कि इंडेक्स रेंज लुक या क्लस्टर स्कैन का उपयोग करना है या नहीं।

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