2012-08-06 15 views
17

का उपयोग करके संकुल अनुक्रमणिका स्कैन लागत को कम करने मैं नीचे उल्लेख क्वेरीकैसे SQL क्वेरी

DECLARE @PARAMVAL varchar(3) 

set @PARAMVAL = 'CTD' 
select * from MASTER_RECORD_TYPE where [email protected] 

के संकुल अनुक्रमणिका लागत स्कैन कैसे कम कर सकते हैं अगर मैं ऊपर क्वेरी चलाने यह दिखाया जा रहा था सूचकांक स्कैन 99%

यहाँ

enter image description here

नीचे मैं मेज के लिए मेरी सूचकांक चिपकाया है:

कृपया यहाँ मेरी मेज विशेषताओं नीचे खोजने

CREATE TABLE [dbo].[MASTER_RECORD_TYPE] ADD CONSTRAINT [PK_MASTER_REPORD_TYPE] PRIMARY KEY CLUSTERED 
(
    [Record_Type_Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] 
GO 

कृपया सलाह दें कि मैं इंडेक्स स्कैन लागत को कैसे कम कर सकता हूं?

उत्तर

23

सबसे पहले - यदि आप RECORD_TYPE_CODE खोजते हैं तो आपको उस कॉलम पर एक इंडेक्स रखना सुनिश्चित करना चाहिए।

कि मुख्य रूप से दो बातों के अलावा:

  • नहीं उपयोग कर SELECT * - कि हमेशा पूर्ण डेटा पेज पाने के लिए क्लस्टर सूचकांक के लिए वापस जाना होगा; एक SELECT कि स्पष्ट रूप से निर्दिष्ट करता है जो कॉलम

  • उपयोग करने के लिए अगर कभी संभव हो, एक है के लिए एक रास्ता nonclustered अनुक्रमणिका, उदा कवर खोजने की कोशिश का उपयोग एक सूचकांक आप इस तरह के एक कवर nonclustered अनुक्रमणिका है कि सभी स्तंभों क्वेरी

को संतुष्ट करने के लिए आवश्यक होता है, फिर क्वेरी अनुकूलक सबसे अधिक संभावना का उपयोग करेगा कि वास्तविक क्लस्टर सूचकांक जो भरा हुआ है के बजाय सूचकांक को कवर (तालिका डेटा) परिणाम प्राप्त करने के लिए

+0

अपने शीघ्र उत्तर के लिए धन्यवाद, आप कृपया मुझे एक कवर गैर क्लस्टर सूचकांक बनाने के लिए मार्गदर्शन कर सकते हैं, क्या कुंजी कि सूचकांक में शामिल होने के लिए आप मुझे बाहर इस – user1494292

+1

पर मदद कर सकते हैं दोस्त बनाएं nonclustered अनुक्रमणिका [MST_IDX_FOR_REC_TYPE ] चालू [डीबीओ]।[MASTER_RECORD_TYPE] ( \t [Record_Type_Code] ASC ) (PAD_INDEX = बंद, STATISTICS_NORECOMPUTE = बंद, SORT_IN_TEMPDB = बंद, IGNORE_DUP_KEY = बंद, DROP_EXISTING = बंद, ऑनलाइन = बंद, ALLOW_ROW_LOCKS = पर, ALLOW_PAGE_LOCKS =) पर [प्राथमिक के साथ ] जाओ अब इंडेक्स स्कैन को 100% – user1494292

+1

@ user1494292 पर इंडेक्स की तलाश में बदल दिया गया है: ठीक है - तो अब आपके पास ** इंडेक्स की तलाश ** है - जो लाने के लिए सबसे कुशल (और सबसे तेज़) तरीका है (कुछ पंक्तियां के) डेटा –

0

आपको कवर किए गए इंडेक्स को आजमाने और उपयोग करने की आवश्यकता है। लेकिन जिस समस्या का आप जा रहे हैं वह यह है कि आप SELECT * का उपयोग कर रहे हैं। क्या आपको वास्तव में पूरे रिकॉर्ड की आवश्यकता है?

किसी भी तरह से, RECORD_TYPE_CODE को अन्य इंडेक्स में जोड़ें और इससे क्वेरी के साथ मदद मिलेगी क्योंकि कम से कम उस फ़ील्ड को इंडेक्स पेज से पढ़ा जा सकता है।

+0

हाय दोस्त, आपके त्वरित उत्तर के लिए धन्यवाद, भले ही मैं Master_record_type से चुनिंदा 1 का उपयोग करता हूं, फिर भी उसी इंडेक्स स्कैन लागत को – user1494292

0

आपकी क्वेरी में, आपने कॉलम RECORD_TYPE_CODE का उपयोग किया है जो clustered index का हिस्सा नहीं है और यह भी non-clustered index में भी शामिल नहीं है। इसलिए एसक्यूएल ऑप्टिमाइज़र क्लस्टर इंडेक्स को स्कैन करने का फैसला करेगा जहां क्लॉज अनुमानित है।

Why is there a scan on my clustered index?

+0

उम फेंक रहा था, हाँ यह क्लस्टर इंडेक्स = तालिका का हिस्सा है। कोई अन्य सूचकांक नहीं है। – Suncat2000