2012-12-18 14 views
8

का उपयोग कर प्रदर्शन मैं एसक्यूएल सर्वर 2012DISTINCT COUNT

चला रहा हूँ मैं एक प्रश्न है कि जब धारीदार यह सबसे बुनियादी रूप है करने के लिए है इस तरह दिखता है:

SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads 
WHERE yearID >=12 AND yearID <=21 

सुराग तालिका में के बारे में 149 मिलियन रिकॉर्ड है यह। लीडआईडी पर एक क्लस्टर्ड इंडेक्स और गैर-क्लस्टर इंडेक्स है जो साल आईडी पर इंडेक्स है और इसमें पूर्ण एड्रेस शामिल है।

इस क्वेरी को चलाने के लिए लगभग 40 सेकंड लगते हैं। मुझे एहसास है कि बुरा नहीं है लेकिन इस स्थिति में यह पर्याप्त तेज़ नहीं है।

मैंने निष्पादन योजना को देखा और मैं 60% लागत के बारे में बता सकता हूं कि DISTINCT COUNT है।

SELECT COUNT(*) as quickCount 
FROM leads 
WHERE yearID >=12 AND yearID <=21 

यह चलाने के लिए केवल 1 सेकंड लेता है:

जब मैं इस तरह DISTINCT COUNT बिना एक ही क्वेरी चलाते हैं।

दुर्भाग्य से, मुझे अलग-अलग पूर्ण पते की गिनती प्राप्त करने की आवश्यकता है। इसलिए मैं यह पता लगाने की कोशिश कर रहा हूं कि पहली क्वेरी को तेजी से चलाने के लिए मैं कुछ कर सकता हूं या नहीं। - http://www.sequenzia.com/execPlan.jpg

क्या मैं अपने मुख्य समस्या बता सकते हैं है

enter image description here

यहाँ यह देखने के लिए भी बड़ा है कि करने के लिए एक कड़ी है:

यहाँ दोनों प्रश्नों के लिये कार्य योजना का एक स्क्रीनशॉट है विशिष्ट क्रमबद्ध (52%)।

इस पर कोई मदद या प्रतिक्रिया बहुत अच्छी होगी।

धन्यवाद!

अद्यतन

मैं थिलो की सलाह मान ली और इस सूचकांक लागू:

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID); 

मैं वास्तव में उनमें से प्रत्येक में ठीक उसी 1 मिलियन रिकॉर्ड के साथ 2 नए परीक्षण टेबल बनाया। मैंने अपनी मूल सूचकांक दोनों को उपरोक्त इंडेक्स को केवल एक के लिए लागू किया। अब जब मैं उसी निष्पादन योजना पर 2 तालिकाओं की तुलना करता हूं तो उपर्युक्त सूचकांक वाला एक व्यक्ति 48% से 52% बेहतर होता है। यहां नई निष्पादन योजना है - http://www.sequenzia.com/execPlan2.jpg

इससे कुछ मदद मिलती है लेकिन मुझे वास्तव में अधिक प्रदर्शन की आवश्यकता है। कोई अन्य विचार?

उत्तर

1

कोशिश करने की एक बात है fullAddress पर एक इंडेक्स का ऑर्डर करके सॉर्टिंग से छुटकारा पाने के लिए (जिसमें yearID कॉलम भी शामिल है ताकि आप कहां से क्लॉज को संतुष्ट कर सकें)।

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID); 

इस तरह, आप एक तेजी से पूर्ण सूचकांक स्कैन (शायद अभी भी सूचकांक रेंज स्कैन आप गैर विशिष्ट गिनती के लिए है की तुलना में धीमी है, लेकिन उम्मीद है कि अपने 40 छँटाई की तुलना में तेजी) मिलना चाहिए।

लेकिन इसे इतनी तेजी से क्यों होने की आवश्यकता है? यह ऐसा कुछ नहीं है जिसे आपको हर समय करने की ज़रूरत है, है ना?यदि यह एक सार्वजनिक वेबसाइट के लिए है, तो आप थोड़ा पुराना कैश्ड परिणाम निकाल सकते हैं, मुझे लगता है।

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