जब नए सूचकांक में सभी स्तंभों को शामिल किया गया था, तो इस नए सूचकांक के प्रदर्शन में इतना सुधार क्यों हुआ?


19

मेरे पास Log और LogItem टेबल हैं; मैं दोनों से कुछ डेटा हड़पने के लिए एक क्वेरी लिख रहा हूं। हजारों हैं Logsऔर प्रत्येक में Log125 तक हो सकते हैंLogItems

प्रश्न में प्रश्न जटिल है, इसलिए मैं इसे छोड़ रहा हूं (यदि कोई सोचता है कि यह महत्वपूर्ण है कि मैं शायद इसे पोस्ट कर सकता हूं), लेकिन जब मैंने एसएसएमएस अनुमानित क्वेरी योजना चलाई, तो उसने मुझे बताया कि एक नया गैर-क्लस्टर सूचकांक 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 या कम।


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

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

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

@ जेफ़ो यह एसएसएमएस ने कहा है: "क्वेरी प्रोसेसर का अनुमान है कि निम्नलिखित सूचकांक को लागू करने से क्वेरी में 100% तक सुधार हो सकता है।"

जवाबों:


21

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

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


क्या तब यह मान लेना सुरक्षित होगा (सामान्य तौर पर) मुझे उस टेबल पर "कहाँ" के एक सूचकांक की आवश्यकता होती है, जो "क्लॉस" होता है?

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

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

@ नहीं आप जरूरत से ज्यादा कोई इंडेक्स नहीं चाहते हैं। एसक्यूएल को बनाए रखने वाले प्रत्येक सूचकांक को अपने स्वयं के उपरि जोड़ता है यदि आप किसी मौजूदा इंडेक्स पर पहले N कॉलम से मिलान करने के लिए अपने WHERE क्लॉज़ को फिर से व्यवस्थित कर सकते हैं, तो आपको बिना किसी इंडेक्स को जोड़े बिना बहुत पास होना चाहिए।
वह चक गाइ

1
@ChuckBlumreich whereखंडों में स्तंभों का क्रम महत्वपूर्ण नहीं है। सर्वर हमेशा मौजूदा सूचकांकों का सबसे अच्छा उपयोग करने के लिए उन्हें व्यवस्थित करेगा। यह केवल एक सूचकांक होने का सवाल है जिसमें whereइसके पहले कॉलम के रूप में सभी आवश्यक कॉलम शामिल हैं।

12

अग्रणी धार एक सूचकांक के क्या मायने रखती है।

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

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

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


इसलिए यदि मेरे पास है Columns (a, b, c, d, e, f)और अधिकांश प्रश्न ... WHERE A IN(...) AND B = 3मेरे सूचकांक हैं Index(a,b,c,d)जो एक अच्छा है, लेकिन यह मदद नहीं करता है यदि मेरे पास ... WHERE A IN (...) AND D = 5है, यही वजह है कि मैंने अपना नया सूचकांक बनाया, Index(a,d)तो प्रदर्शन में सुधार हुआ, है ना?

8
@ नई - सही। इसे फोन बुक की तरह सोचें। यदि आप किसी का पहला नाम जानते हैं, तो यह पूरी किताब को देखे बिना असंभव है क्योंकि यह Lastname, Firstname
JNK
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.