2011-12-19 5 views
5

मेरे पास लॉग और लॉगइटेम टेबल हैं; मैं दोनों से कुछ डेटा पकड़ने के लिए एक प्रश्न लिख रहा हूँ। Logs के हजारों रहे हैं और प्रत्येकइस नए इंडेक्स को प्रदर्शन में इतना सुधार क्यों हुआ जब मौजूदा इंडेक्स में नए इंडेक्स में सभी कॉलम शामिल थे?

हो सकता है सवाल में क्वेरी इतना जटिल है कि मैं यह कर रहा हूँ लंघन (अगर कोई सोचता है कि यह महत्वपूर्ण है शायद मैं इसे पोस्ट कर सकते हैं), लेकिन जब मैं भागा SSMS अनुमानित क्वेरी योजना, उसने मुझे बताया कि एक नया गैर क्लस्टर सूचकांक 100% तक प्रदर्शन में सुधार करेगा।

Existing Index: Non-clustered 
Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified 

Query Plan Recommendation 
CREATE NONCLUSTERED INDEX [LogReportIndex] 
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified]) 

बस मस्ती के लिए, मैं इस नए सूचकांक बनाया है और मेरे आश्चर्य करने के लिए क्वेरी और भी बहुत कुछ भाग गया, यह अब, मेरी क्वेरी को चलाने के लिए लेता है ~ 1 सेकंड जब इससे पहले कि यह 10+ सेकंड था।

मुझे लगता है कि मेरी मौजूदा अनुक्रमणिका इस नई क्वेरी को कवर करेगी, इसलिए मेरा सवाल यह है कि मेरी नई क्वेरी में उपयोग किए गए केवल कॉलम पर एक नई अनुक्रमणिका क्यों बना रही है? क्या मेरे पास where क्लॉज में उपयोग किए गए कॉलम के प्रत्येक अद्वितीय संयोजन के लिए एक अनुक्रमणिका होनी चाहिए?

नोट: मुझे नहीं लगता कि ऐसा इसलिए है क्योंकि SQL सर्वर मेरे परिणामों को कैश कर रहा है, मैंने इंडेक्स बनाने से पहले 25-30 बार क्वेरी चलाई और इसे सूचकांक के बाद लगातार 10-15 सेकंड लिया अब लगातार ~ 1 या उससे कम है।

+0

अतिरिक्त गैर-क्लस्टर इंडेक्स बनाने से पहले, * वास्तविक निष्पादन योजना * सूचकांक उपयोग के लिए क्या दिखाया गया था? –

+0

100% से बेहतर प्रदर्शन क्या है? – JeffO

+0

@ शार्क अच्छा सवाल, मुझे यकीन नहीं है। यह मेरी पहली प्रदर्शन डीबगिंग स्थिति है। मैं आगे बढ़ने के लिए निश्चित रूप से पकड़ लेंगे। यह सब कहा गया था 'लापता सूचकांक' और यह कहा कि कौन से क्षेत्र। – Nate

उत्तर

6

किसी सूचकांक में कॉलम का ऑर्डर महत्वपूर्ण है। अगर फ़िल्टरिंग को इंडेक्स से कॉलम 1 और 4 की आवश्यकता होती है, तो इंडेक्स मदद नहीं करेगा। पहले एन कॉलम द्वारा फ़िल्टर करते समय यह केवल उपयोगी होता है।

ऐसा इसलिए है क्योंकि सूचकांक एक पेड़ है। आप पेड़ के सभी नोड्स को कुशलतापूर्वक नहीं चुन सकते हैं जहां column3 = something, क्योंकि वे column1 और column2 के विभिन्न मानों से संबंधित सभी अन्य स्थान बिखरे हुए हैं। लेकिन अगर आपको column1 और column2 पता है, तो पेड़ में सही शाखा का पता लगाने कोई ब्रेनर नहीं है।

+0

क्या यह मानने के लिए सुरक्षित होगा (सामान्य रूप से) मुझे उस तालिका को हिट करने वाले "कहां" खंडों के सेट के एक इंडेक्स की आवश्यकता है? – Nate

+0

मैंने एक बार किसी और की क्वेरी का भारी गति से यह सुनिश्चित करके सुनिश्चित किया कि यह उचित क्रम में इंडेक्स का उपयोग करता है। –

+0

@ नेट ब्रॉडली, हां। कुछ 'जहां ओवरलैप हो सकता है, तो आपके पास एक इंडेक्स हो सकता है जो अच्छी तरह से कई' कहां कवर करता है; या आप 'कहां' खंड के कुछ हिस्से को अनदेखा कर सकते हैं क्योंकि किसी निश्चित कॉलम पर अनुक्रमण किसी भी तरह (कम चयनकता) की सहायता नहीं करेगा; लेकिन मोटे तौर पर, हाँ। – GSerg

2

सूचकांक के अग्रणी किनारे महत्वपूर्ण है।

जब तक आपकी क्वेरी इंडेक्स के अग्रणी किनारे से "कवर" होती है, तो यह प्रभावी होगी। डाटाबेस इंडेक्स को आम तौर पर बी-पेड़ के रूप में लागू किया जाता है और बी-ट्री की संरचना यह बताती है कि खोज एक निश्चित क्रम में की जानी चाहिए, यही कारण है कि समग्र सूचकांक में फ़ील्ड का क्रम महत्वपूर्ण है।

यदि आपके पास "छेद" है, उदा। यदि आप ParentLogID और DatabaseModified पर खोज करते हैं, लेकिन केवल {ParentLogID, DateModified, Name, DatabaseModified} पर इंडेक्स है, तो केवल {ParentLogID} इंडेक्स का हिस्सा कुशलता से उपयोग किया जा सकता है।

(नोट: कुछ DBMSes "स्कैन छोड़" के माध्यम से {DatabaseModified} भाग का उपयोग कर सकते हैं, लेकिन भले ही आपके डीबीएमएस करता है कि यह बहुत कम नियमित सूचकांक पहुँच से कुशल है)

+0

तो यदि मेरे पास 'कॉलम (ए, बी, सी, डी, ई, एफ) 'है और अधिकांश प्रश्न हैं ... जहां एक आईएन (...) और बी = 3' मेरा इंडेक्स 'इंडेक्स (ए, बी, सी, डी)' यह एक अच्छा है, लेकिन अगर यह है तो यह मदद नहीं करता है ... जहां एक आईएन (...) और डी = 5' है मैंने अपना नया इंडेक्स क्यों बनाया, 'इंडेक्स (ए, डी)' बेहतर प्रदर्शन इतना सही है, है ना? – Nate

+1

@Nate - सही। एक फोन बुक की तरह सोचो। यदि आप किसी के पहले नाम को जानते हैं, तो पूरी किताब को देखे बिना खोजना असंभव है क्योंकि यह अंतिम नाम, फर्स्टनाम पर व्यवस्थित है – JNK

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