2011-01-28 14 views
5

क्या कोई मुझे इस SQL ​​क्वेरी को ट्यून करने में मदद कर सकता है?यह SQL परिणाम इंडेक्स खोज के बजाय इंडेक्स स्कैन में क्यों परिणाम देता है?

SELECT a.BuildingID, a.ApplicantID, a.ACH, a.Address, a.Age, a.AgentID, a.AmenityFee, a.ApartmentID, a.Applied, a.AptStatus, a.BikeLocation, a.BikeRent, a.Children, 
     a.CurrentResidence, a.Email, a.Employer, a.FamilyStatus, a.HCMembers, a.HCPayment, a.Income, a.Industry, a.Name, a.OccupancyTimeframe, a.OnSiteID, 
     a.Other, a.ParkingFee, a.Pets, a.PetFee, a.Phone, a.Source, a.StorageLocation, a.StorageRent, a.TenantSigned, a.WasherDryer, a.WasherRent, a.WorkLocation, 
     a.WorkPhone, a.CreationDate, a.CreatedBy, a.LastUpdated, a.UpdatedBy 
FROM dbo.NPapplicants AS a INNER JOIN 
     dbo.NPapartments AS apt ON a.BuildingID = apt.BuildingID AND a.ApartmentID = apt.ApartmentID 
WHERE (apt.Offline = 0) 
AND  (apt.MA = 'M') 

यहां निष्पादन योजना की तरह दिखता है:

enter image description here

मैं क्या समझ में नहीं आता कि मैं क्यों NPapplicants के लिए एक सूचकांक स्कैन हो रही है। मेरे पास एक इंडेक्स है जो बिल्डिंगआईडी और अपार्टमेंटआईडी को कवर करता है। इसका इस्तेमाल नहीं किया जाना चाहिए?

+0

तालिका एनपीप्लिकेंट्स में कितनी पंक्तियां हैं? –

+0

छवि नवीनतम आंकड़े अद्यतन – RichardTheKiwi

उत्तर

6

ऐसा इसलिए है क्योंकि यह मैचों से वापस आने के लिए करीब 10 के रिकॉर्ड की उम्मीद कर रहा है। 10K कुंजी का उपयोग करके अन्य कॉलम पुनर्प्राप्त करने के लिए डेटा पर वापस जाने के लिए 100K रिकॉर्ड्स स्कैनिंग (कम से कम) और हैश मैच का उपयोग करके फ़िल्टरिंग के प्रदर्शन की तरह कुछ के बराबर है।

अन्य तालिका तक पहुंच के लिए, क्वेरी ऑप्टिमाइज़र ने निर्णय लिया है कि आपकी अनुक्रमणिका उपयोगी है (शायद Offline या MA के विरुद्ध) तो यह जॉइन कुंजी प्राप्त करने के लिए उस इंडेक्स पर जा रही है।

इन दोनों को अंतिम आउटपुट बनाने के लिए छेड़छाड़ के लिए मिलान किया गया है।

+0

प्रतिक्रिया के लिए धन्यवाद 7775 दिखाती है। तो क्या आप कह रहे हैं कि मैं इतना कुछ नहीं कर सकता। प्रश्न ठीक-ठीक के बारे में है क्योंकि यह उस डेटा के साथ वापस आने जा रहा है? – Axeva

+0

आवेदक तालिका से कॉलम की उस राशि के लिए - हाँ, यह जितना अच्छा हो उतना अच्छा है। जब तक कि 'अपार्टमेंट (ऑफ़लाइन, एमए)' पर फ़िल्टर वास्तव में वास्तव में चुनिंदा नहीं है (जैसे 1% या उससे कम) और 'गिनती (अपार्टमेंट) <गिनती (आवेदक)' जैसे कि यह केवल कुछ कुंजियां उत्पन्न कर सकता है जिस पर INDEX SEEK पर आवेदक। – RichardTheKiwi

3

B-Tree इंडेक्स में एक खोज तालिका स्कैन (प्रति रिकॉर्ड) के रूप में कई गुना महंगा है।

इसके अतिरिक्त, अन्य कॉलम के मानों को पुनर्प्राप्त करने के लिए क्लस्टर इंडेक्स में एक और खोज की जानी चाहिए।

यदि रिकॉर्ड का एक बड़ा हिस्सा मिलान होने की उम्मीद है, तो क्लस्टर्ड इंडेक्स को स्कैन करना सस्ता है।

सुनिश्चित करें कि अनुकूलक सबसे अच्छा तरीका चुना था बनाने के लिए, आप इस चला सकते हैं:

SET STATISTICS IO ON 
SET STATSTICS TIME ON 

SELECT a.BuildingID, a.ApplicantID, a.ACH, a.Address, a.Age, a.AgentID, a.AmenityFee, a.ApartmentID, a.Applied, a.AptStatus, a.BikeLocation, a.BikeRent, a.Children, 
     a.CurrentResidence, a.Email, a.Employer, a.FamilyStatus, a.HCMembers, a.HCPayment, a.Income, a.Industry, a.Name, a.OccupancyTimeframe, a.OnSiteID, 
     a.Other, a.ParkingFee, a.Pets, a.PetFee, a.Phone, a.Source, a.StorageLocation, a.StorageRent, a.TenantSigned, a.WasherDryer, a.WasherRent, a.WorkLocation, 
     a.WorkPhone, a.CreationDate, a.CreatedBy, a.LastUpdated, a.UpdatedBy 
FROM dbo.NPapplicants AS a INNER JOIN 
     dbo.NPapartments AS apt ON a.BuildingID = apt.BuildingID AND a.ApartmentID = apt.ApartmentID 
WHERE (apt.Offline = 0) 
AND  (apt.MA = 'M') 

SELECT a.BuildingID, a.ApplicantID, a.ACH, a.Address, a.Age, a.AgentID, a.AmenityFee, a.ApartmentID, a.Applied, a.AptStatus, a.BikeLocation, a.BikeRent, a.Children, 
     a.CurrentResidence, a.Email, a.Employer, a.FamilyStatus, a.HCMembers, a.HCPayment, a.Income, a.Industry, a.Name, a.OccupancyTimeframe, a.OnSiteID, 
     a.Other, a.ParkingFee, a.Pets, a.PetFee, a.Phone, a.Source, a.StorageLocation, a.StorageRent, a.TenantSigned, a.WasherDryer, a.WasherRent, a.WorkLocation, 
     a.WorkPhone, a.CreationDate, a.CreatedBy, a.LastUpdated, a.UpdatedBy 
FROM dbo.NPapplicants WITH (INDEX (index_name)) AS a 
INNER JOIN 
     dbo.NPapartments AS apt ON a.BuildingID = apt.BuildingID AND a.ApartmentID = apt.ApartmentID 
WHERE (apt.Offline = 0) 
AND  (apt.MA = 'M') 

अपने सूचकांक के वास्तविक नाम से index_name बदलें और (निष्पादन समय और I/O आपरेशन के संख्याओं की तुलना के रूप में संदेश टैब में देखा गया)

+1

दिलचस्प। सूचकांक के बिना: सीपीयू समय = 9 3 एमएस, समय बीत गया = 679 एमएस। /// इंडेक्स के साथ: सीपीयू समय = 172 एमएस, समय बीत गया = 666 एमएस। – Axeva

+0

@ एक्सेवा: जैसा कि आप देख सकते हैं, माँ अनुकूलक ने कोई मूर्ख नहीं उठाया। गैर-चुनिंदा क्षेत्रों पर, एक इंडेक्स तलाश अधिक महंगा है, खासकर गैर-कवरिंग इंडेक्स के साथ। – Quassnoi

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