क्‍लेस्‍डर्ड इंडेक्‍स स्‍कैन की संख्‍या इतनी अधिक क्यों है?


15

मेरे पास दो समान प्रश्न हैं जो एक ही क्वेरी योजना उत्पन्न करते हैं, सिवाय इसके कि एक क्वेरी प्लान क्लस्टर्ड इंडेक्स स्कैन 1316 बार निष्पादित करता है, जबकि दूसरा इसे 1 बार निष्पादित करता है।

दोनों प्रश्नों के बीच एकमात्र अंतर अलग-अलग तिथि मानदंड है। लंबे समय तक चलने वाली क्वेरी वास्तव में डेट मानदंड को कम करती है, और कम डेटा वापस खींचती है।

मैंने कुछ इंडेक्स की पहचान की है जो दोनों प्रश्नों के साथ मदद करेंगे, लेकिन मैं सिर्फ यह समझना चाहता हूं कि क्‍लस्‍टर्ड इंडेक्स स्‍कैन ऑपरेटर क्‍वेरी पर 1316 बार क्‍यों निष्पादित कर रहा है जो वस्‍तुत: उसी के समान है जहां यह 1 बार निष्पादित होता है।

मैंने PK पर उन आँकड़ों की जाँच की जो स्कैन किए जा रहे हैं, और वे अपेक्षाकृत पुराने हैं।

मूल प्रश्न:

select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
    select incident_id as exported_incident_id
    from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-06-01 00:00:00.000' and '2011-07-01 00:00:00.000'
    and exported_incidents.exported_incident_id is not null

इस योजना को उत्पन्न करता है: यहाँ छवि विवरण दर्ज करें

तिथि सीमा मानदंड सीमित करने के बाद:

select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
    select incident_id as exported_incident_id
    from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'
    and exported_incidents.exported_incident_id is not null

इस योजना को उत्पन्न करता है: यहाँ छवि विवरण दर्ज करें


क्या आप छवि फ़ाइलों के बजाय एक कोड ब्लॉक में अपने प्रश्नों को कॉपी / पेस्ट कर सकते हैं?
एरिक हम्फ्री - लॉटहेल्प

ज़रूर - मैंने उन प्रश्नों को जोड़ा जो प्रत्येक योजना को उत्पन्न कर रहे हैं।
सीबर

किस टेबल पर क्लस्टर इंडेक्स स्कैन होता है?
एरिक हम्फ्रे - लॉटहेल्प

बायीं ज्वाइन (PostNFIRSSummary) में सीक्वेर्ड इंडेक्स स्कैन उपकुंजी पर है
सिबियार

1
संभवत: पिछली बार के आँकड़े अपडेट किए गए थे कि FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'मापदंड को पूरा करने वाली केवल शून्य या एक पंक्ति थी और तब से उस सीमा में आवेषणों की संख्या विषम हो गई है। यह अनुमान है कि उस तिथि सीमा के लिए केवल 1.07 निष्पादन की आवश्यकता होगी। 1,316 नहीं जो वास्तविकता में सुनिश्चित करता है।
मार्टिन स्मिथ

जवाबों:


9

स्कैन के बाद जोइन एक सुराग देता है: आखिरी में शामिल होने के एक तरफ कम पंक्तियों के साथ (पाठ्यक्रम के बाएं से दाएं पढ़ने) ऑप्टिमाइज़र एक "नेस्टेड लूप" चुनता है न कि "हैश जॉइन"।

हालाँकि, इसे देखने से पहले मैं मुख्य लुकअप और DISTINCT को समाप्त करना चाहता हूँ।

  • मुख्य खोज: FIR_Incident पर आपके सूचकांक को कवर किया जाना चाहिए, शायद (FI_IncidentDate, incidentid)या दूसरे तरीके से। या दोनों हैं और देखें जो अधिक बार उपयोग किया जाता है (वे दोनों हो सकते हैं)

  • DISTINCTका परिणाम है LEFT JOIN ... IS NOT NULL। ऑप्टिमाइज़र ने पहले ही इसे हटा दिया है (योजनाओं में अंतिम जॉय पर "बाएं अर्ध जुड़ाव" है) लेकिन मैं स्पष्टता के लिए EXISTS का उपयोग करूंगा

कुछ इस तरह:

select 
    F.IncidentID
from 
    FIR_Incident F
where 
    exists (SELECT * FROM postnfirssummary P
           WHERE P.incident_id = F.incidentid)
    AND
    F.FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'

आप एसक्यूएल सर्वर का उपयोग करने के लिए प्लान गाइड और जॉइन संकेत का उपयोग भी कर सकते हैं , लेकिन इसे सामान्य रूप से पहले काम करने की कोशिश करें: एक गाइड या एक संकेत शायद समय की कसौटी पर खड़ा नहीं होगा क्योंकि वे केवल डेटा के लिए उपयोगी हैं और अब आपके द्वारा चलाए जा रहे प्रश्न भविष्य में नहीं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.