2011-11-29 16 views
7
SELECT X.ID, X.Field4 
FROM 
     #TaxInvoiceData T 
INNER JOIN 
     xxx X 
     ON T.Id = X.Id 
     AND Field2 = @VAR  
     AND Field3 = 'S' 

मुझे समझ नहीं आता जब मैं एक प्रश्न एक पूर्ण तालिका तालिका एक्स पर स्कैन चलाने क्यों क्योंकि तालिका एक्स के प्राथमिक कुंजीटेबल स्कैन क्यों किया जा रहा है?

ID INT ASC 
Field3 CHAR(2) ASC 
Field2 DATETIME ASC Unique Non-clustered 

है वहाँ भी

Field2 DATETIME ASC Non-Unique Non-clustered 
पर एक सूचकांक है

सूचकांक की तलाश करता है

01 बस

SELECT ID 
FROM xxx 
WHERE 
    Field2 = @VAR 
AND Field3 = 'S' 

कर

अग्रिम धन्यवाद।

+0

#TaxInvoiceData में कितनी पंक्तियां हैं? – Joe

+0

* क्या एक सूचकांक खोजता है * - ठीक है, लेकिन ** ** सूचकांक ** ??? इसके अलावा: आप कहते हैं कि '(आईडी, फ़ील्ड 2, फ़ील्ड 3) 'आपके' टेबल एक्स 'पर प्राथमिक कुंजी हैं - क्या यह तालिका पर ** क्लस्टर्ड इंडेक्स ** भी है ?? या यह एक ढेर है ?? –

+0

एस क्वेरी में कैसे शामिल हो गया है? ऐसा हो सकता है कि प्राथमिक कुंजी को क्लस्टर नहीं किया गया है क्योंकि प्रत्येक पंक्ति के लिए सूचकांक और तालिका के बीच कूदने के बजाय तालिका को स्कैन करना तेज़ है। – idstam

उत्तर

5

लघु जवाब: क्योंकि अनुकूलक सोचता है कि यह तेजी से होगा।

हालांकि, आइए ऑप्टिमाइज़र के दिमाग को पढ़ने का प्रयास करें।

चूंकि आपने पूर्ण तालिका स्कीमा प्रदान नहीं किया है, इसलिए मुझे लगता है कि xxx.ID पर एक क्लस्टर्ड इंडेक्स है और #TaxInvoiceData एक ढेर है। आप एक ऐसी योजना की उम्मीद कर रहे हैं जहां #TaxInvoiceData में प्रत्येक पंक्ति के लिए पीके इंडेक्स की जांच की जाए, लेकिन आप xxx.Field4 चुन रहे हैं जिसके लिए प्रत्येक मैच के लिए बुकमार्क लुकअप की आवश्यकता होगी। इसके परिणामस्वरूप 2 9, 000 यादृच्छिक I/O अनुरोध हो सकते हैं। आउच।

इसके विपरीत, एसक्यूएल सर्वर सिर्फ अधिक कुशल अनुक्रमिक की एक बड़ी राशि प्रदर्शन आई/ओ तालिका स्कैन करने और शायद #TaxInvoiceData के खिलाफ एक तेजी से हैश मैच कर रहा है (और जाहिरा तौर पर करने जा रहा है) हो सकता है।

तो आप क्या कर सकते हैं? आप Field4 सहित एक कवर इंडेक्स बना सकते हैं। या आप इंडेक्स का उपयोग कर सकते हैं और जिस योजना को आप ढूंढ रहे हैं उसे मजबूर करने के लिए संकेतों में शामिल हो सकते हैं (लेकिन मुझे संदेह है कि प्रदर्शन उतना अच्छा नहीं होगा जितना आप उम्मीद करते हैं)। क्या यह क्वेरी अक्सर पर्याप्त रूप से उपयोग की जाती है कि यह आपके एप्लिकेशन की प्रदर्शन समस्याएं दे रही है या क्या आप सिद्धांत पर तालिका स्कैन को खत्म करने की सोच रहे हैं? यदि उत्तरार्द्ध, आपको स्कैन से छुटकारा पाने का ओवरहेड मिल सकता है तो अंत में इसके लायक नहीं है।


संपादित करें:

आप उल्लेख किया है के बाद से मेज पर कोई संकुल अनुक्रमणिका यह है कि, यह भी प्रभावित कर सकता है कैसे कुशल लुकअप सूचकांक से कर रहे हैं। जब तक यह तालिका अत्यधिक भारी सम्मिलित गतिविधि नहीं देख रही है, तब तक अपने पीके को क्लस्टर करने के लिए बदलने पर विचार करें। वह अकेला योजना बदल सकता है, और यहां तक ​​कि अगर यह कम ओवरहेड के कारण अन्य परिचालनों को तेज करने की संभावना नहीं है।

+0

स्पष्टीकरण के लिए धन्यवाद, जो लोग सहमत हैं। लेकिन मेरी अज्ञानता को माफ कर दो, मुझे समझ में नहीं आ रहा है कि फ़ील्ड 4 क्यों फर्क पड़ता है क्योंकि यह चयन है और नहीं, जहां मुझे लगता है कि यह इस तरह काम करेगा, पेज/पंक्ति/पत्ता को उस खंड से ढूंढें और उस क्षेत्र से पकड़ लें पंक्ति। तो मैं समझ नहीं पा रहा हूं कि फ़ील्ड 4 की एक सूची एक खोज में सुधार कैसे करेगी। इसके अलावा कोई क्लस्टर्ड इंडेक्स केवल पीके नहीं है जिसे किसी भी कारण से गैर-क्लस्टर किया गया था। – Mike

+5

यदि किसी भी क्वेरी की आवश्यकता किसी सूचकांक में निहित है, तो SQL सर्वर बस वहां देख सकता है और पूरी तरह से तालिका का उपयोग करने से बच सकता है। इसे क्वेरी के लिए "कवर इंडेक्स" कहा जाता है और आमतौर पर बहुत ही कुशल होता है। यह आपकी स्थिति का मामला नहीं है क्योंकि फ़ील्ड 4 को टेबल से पढ़ना है। समस्या इस तथ्य के कारण है कि सूचकांक पंक्ति द्वारा संदर्भित तालिका में पंक्ति को देखकर बार-बार (कई हज़ार बार) I/O ओवरहेड के कारण बहुत प्रभावी नहीं है। ऑप्टिमाइज़र यह सब तय कर रहा है जब यह तय करता है कि क्या करना है। – zinglon

-2

शायद पुनर्लेखन क्वेरी में मदद मिलेगी:

SELECT X.ID, X.Field4 
FROM xxx X, #TaxInvoiceData T 
WHERE X.Id = T.Id   
AND X.Field2 = @VAR    
AND X.Field3 = 'S' 
+0

उस समय के लिए धन्यवाद, लेकिन इसने क्वेरी योजना को नहीं बदला है। – Mike

+6

यह मानक 'जॉइन' सिंटैक्स नहीं है, इस क्वेरी को फिर से लिखना कोई प्रभाव नहीं होना चाहिए * और * कोड को और खराब कर दें, -1 – Matthew

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