2009-07-21 9 views
19

एसक्यूएल 2000
NED तालिका SIGN.RowID साइन तालिका NED.RowID के लिए एक विदेशी कुंजी है
इन तालिका NED.SignID
RowID और SignID को NED तालिका SIGN.SignID के लिए एक विदेशी कुंजी है क्लस्टर प्राथमिक कुंजी है कि GUIDs (नहीं मेरी पसंद) कर रहे हैं
कहां खंड है:मेरे क्लस्टर्ड इंडेक्स पर स्कैन क्यों है?

FROM 
    [SIGN] A 
    INNER JOIN NED N ON A.SIGNID = N.SIGNID 
    INNER JOIN Wizard S ON A.WizardID = S.WizardID 
    INNER JOIN [Level] SL ON N.LevelID = SL.LevelID 
    LEFT JOIN Driver DSL ON SL.LevelID = DSL.LevelID 
     AND DSL.fsDeptID = @fsDeptID 
    INNER JOIN [Character] ET ON S.CharacterID = ET.CharacterID 
    INNER JOIN Town DS ON A.TownID = DS.TownID 
WHERE 
    (A.DeptID = @DeptID OR 
    S.DeptID = @DeptID 
    AND 
    A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime 
    AND 
    A.NEDStatusID = 2  

क्यों इस प्रश्न के लिए साइन इन करें मेज पर एक सूचकांक स्कैन है? क्लस्टर्ड इंडेक्स पर इंडेक्स स्कैन का कारण क्या होगा? धन्यवाद

+0

मुझे यह पूछना है कि आप इस प्रश्न से क्या अपेक्षा करते हैं या आप क्यों सोचते हैं कि इस मामले में इंडेक्स स्कैन एक समस्या है? – Welbog

+0

क्या आप किसी अन्य डीबीएमएस से आ रहे हैं और हैश जॉइन या क्लस्टर में शामिल होने की अपेक्षा कुछ देखने की उम्मीद कर रहे हैं? यदि हां, तो आपको अवगत होना चाहिए कि SQL सर्वर में, क्लस्टर्ड इंडेक्स बस एक वृक्ष अनुक्रमणिका है जहां पत्ता नोड डेटा पेज होते हैं। यदि आप पहले से ही यह जानते थे, तो इस टिप्पणी को अनदेखा करें। – kdgregory

उत्तर

9

यहाँ जब एसक्यूएल सर्वर एक सूचकांक/तालिका स्कैन करने के लिए एक सूचकांक से "टिपिंग प्वाइंट" और स्विच की तलाश तक पहुँच जाता है के बारे में एक अच्छा ब्लॉग पोस्ट है:

http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx

आप कर सकते हैं अपने प्रश्नों को फ़िल्टर करने के तरीके को देखें, क्योंकि टिपिंग पॉइंट अक्सर लोगों की अपेक्षा से कम पंक्तियां होती है।

14

क्योंकि आपका WHERE खंड अनुक्रमित कॉलम के खिलाफ नहीं है।

+5

यह सच है, लेकिन यह वास्तव में कुछ भी समझा नहीं है। –

+2

लेकिन उसने अपने प्रश्न का उत्तर दिया। :) – MyItchyChin

+0

उन्होंने उल्लेख नहीं किया कि उनके पास कौन सी अनुक्रमणिका थीं। लेकिन यह एक मान्य और आम धारणा है। – Suncat2000

22

क्लस्टर्ड इंडेक्स स्कैन यह है कि SQL सर्वर क्लस्टरर्ड इंडेक्स वाले तालिका पर एक पूर्ण तालिका स्कैन कैसे निर्दिष्ट करता है। ऐसा इसलिए है क्योंकि WHERE क्लॉज को संतुष्ट करने के लिए आपके पास साइन तालिका पर पर्याप्त अनुक्रमणिका नहीं हैं, या क्योंकि यह निर्णय लेता है कि साइन तालिका पर्याप्त छोटा है (या इंडेक्स पर्याप्त चुनिंदा नहीं है) कि एक टेबल स्कैन अधिक कुशल होगा।

बस क्वेरी की जांच करके, आपको शायद तालिका स्कैन से बचने के लिए DeptID कॉलम के साथ-साथ स्टार्टटाइम, एंडटाइम और NEDStatusID के कुछ संयोजन को इंडेक्स करना होगा। यदि आप जो कारण पूछ रहे हैं वह इसलिए है क्योंकि आपको प्रदर्शन समस्याएं आ रही हैं, तो आप इंडेक्स ट्यूनिंग विज़ार्ड (अब SQL2005 + क्लाइंट टूल्स में डेटाबेस इंजन ट्यूनिंग सलाहकार) चला सकते हैं और यह कुछ सलाह दे सकते हैं कि कौन से इंडेक्स को गति में बनाना है अपनी क्वेरी ऊपर।

2

आप इन एक मेज पर कई प्रतिबंध नहीं है अगर मैं इस सही ढंग से पढ़ें:

WHERE 
     (A.DeptID = @DeptID OR 
     S.DeptID = @DeptID 
     AND 
     A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime 
     AND 
     A.NEDStatusID = 2 

उन प्रतिबंधों के किसी भी कर रहे हैं (DeptID, StartTime, ENDTIME, NEDStatusID की तरह) अनुक्रमित? आपके क्षेत्र के डेटा से चुने गए क्षेत्र कितने अच्छे हैं?

यदि आपके पास 10 एमओओ है। पंक्तियों और NEDStatusID में केवल 10 संभावित मान हैं, फिर उस क्षेत्र पर कोई भी प्रतिबंध हमेशा पैदा करेगा। 1 एमओओ पंक्तियां - उस स्थिति में, SQL सर्वर के लिए पूर्ण तालिका स्कैन (क्लस्टरर्ड इंडेक्स स्कैन) करने के लिए यह आसान (और कम महंगा) हो सकता है, विशेष रूप से यदि उसे उसी तालिका पर अतिरिक्त WHERE क्लॉज की जांच करने की आवश्यकता होती है जो अनुक्रमित नहीं हैं , या तो (स्टार्टटाइम, एंडटाइम इत्यादि)।

मार्क

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

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