क्या मुझे प्रत्येक प्रकार के क्वेरी के लिए अलग-अलग इंडेक्स चाहिए, या एक मल्टी-कॉलम इंडेक्स काम करेगा?


22

मैं कुछ हद तक इस सवाल का जवाब पहले से ही जानता हूं, लेकिन मुझे हमेशा ऐसा लगता है कि इस विषय पर मुझे कुछ और चुनने की जरूरत है।

मेरी बुनियादी समझ यह है कि आम तौर पर बोलना, एक एकल सूचकांक जिसमें बस उन सभी क्षेत्रों को शामिल किया जाता है जिन्हें आप किसी भी समय पर क्वेरी / छांट सकते हैं, उपयोगी होने की संभावना नहीं है, फिर भी मैंने इस प्रकार की चीज देखी है। जैसा कि, किसी ने सोचा, "ठीक है, अगर हम सिर्फ यह सब सामान एक इंडेक्स में डालते हैं, तो डेटाबेस इसका उपयोग कर सकता है कि इसे क्या चाहिए", कभी भी वास्तविक प्रश्नों को चलाने के लिए एक निष्पादन योजना देखे बिना।

एक तालिका की तरह कल्पना करें:

id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime

मैं सहित एक भी सूचकांक देख सकते हैं name, customerIdऔर dateCreatedखेतों।

लेकिन मेरी समझ यह है कि इस तरह के सूचकांक का उपयोग क्वेरी में नहीं किया जाएगा, उदाहरण के लिए:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

इस तरह की क्वेरी के लिए, यह मुझे लगता है कि एक बेहतर विचार एक इंडेक्स होगा जिसमें फ़ील्ड्स customerIdऔर dateCreatedफ़ील्ड्स शामिल होंगे, जिसमें customerIdफ़ील्ड 'पहले' होगा। यह एक सूचकांक बनाएगा जिसमें डेटा इस तरह से व्यवस्थित होगा कि यह क्वेरी जल्दी से यह पा सके कि उसे क्या चाहिए - इस क्रम में।

एक और चीज जो मैं देख रहा हूं, शायद पहले जितनी बार, प्रत्येक क्षेत्र पर व्यक्तिगत सूचकांक है; हां, तो एक-एक पर name, customerIdऔर dateCreatedखेतों।

पहले उदाहरण के विपरीत, इस प्रकार की व्यवस्था मुझे कभी-कभी कम से कम आंशिक रूप से उपयोगी लगती है; क्वेरी का निष्पादन योजना दिखा सकती है कि कम से कम यह customerIdरिकॉर्ड का चयन करने के लिए सूचकांक का उपयोग कर रहा है , लेकिन यह dateCreatedउन्हें सॉर्ट करने के लिए फ़ील्ड के साथ सूचकांक का उपयोग नहीं कर रहा है।


मुझे पता है कि यह एक व्यापक प्रश्न है, क्योंकि किसी भी विशेष तालिकाओं के किसी विशेष प्रश्न का विशिष्ट उत्तर आमतौर पर यह देखने के लिए है कि निष्पादन योजना क्या कहती है कि वह क्या करने जा रही है, और अन्यथा तालिका (एस) की बारीकियों और प्रश्नों को लें लेखा। इसके अलावा, मुझे पता है कि यह इस बात पर निर्भर करता है कि किसी विशेष सूचकांक को बनाए रखने के ओवरहेड के विपरीत एक क्वेरी कितनी बार चल सकती है।

लेकिन मुझे लगता है कि मैं जो पूछ रहा हूं वह इंडेक्स के लिए एक सामान्य 'शुरुआती बिंदु' के रूप में है, क्या विशिष्ट, अक्सर-खींचे गए प्रश्नों के लिए विशिष्ट इंडेक्स होने और WHERE या ORDER BY फ़ील्ड के विचार का कोई मतलब है?

जवाबों:


27

आप सही हैं कि आपकी उदाहरण क्वेरी उस सूचकांक का उपयोग नहीं करेगी।

क्वेरी प्लानर एक सूचकांक का उपयोग करने पर विचार करेगा यदि:

  • इसमें निहित सभी फ़ील्ड क्वेरी में संदर्भित हैं
  • शुरुआत से शुरू होने वाले कुछ क्षेत्रों को संदर्भित किया जाता है

यह उन अनुक्रमितों का उपयोग करने में सक्षम नहीं होगा जो क्वेरी द्वारा उपयोग नहीं किए गए क्षेत्र से शुरू होते हैं।

तो आपके उदाहरण के लिए:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

यह सूचकांक पर विचार करेगा जैसे:

[customerId]
[customerId], [dateCreated]
[customerId], [dateCreated], [name]

लेकिन नहीं:

[name], [customerId], [dateCreated]

यदि यह दोनों [customerId]और [customerId], [dateCreated], [name]इसके एक दूसरे को पसंद करने का निर्णय पाया जाता है, तो यह सूचकांक आँकड़ों पर निर्भर करेगा जो खेतों में डेटा के संतुलन के अनुमानों पर निर्भर करता है। अगर[customerId], [dateCreated] इसे परिभाषित किया गया है, तो यह पसंद करना चाहिए कि जब तक आप एक विशिष्ट सूचकांक संकेत नहीं देते हैं, तब तक अन्य दो से अधिक हो।

मेरे अनुभव में हर क्षेत्र के लिए परिभाषित एक सूचकांक को देखना असामान्य नहीं है, हालांकि यह शायद ही कभी इष्टतम है क्योंकि अनुक्रमणिका को सम्मिलित / अद्यतन पर अद्यतन करने के लिए आवश्यक अतिरिक्त प्रबंधन, और उन्हें संग्रहीत करने के लिए आवश्यक अतिरिक्त स्थान बर्बाद हो जाता है, जब आधा हो जाता है उनका उपयोग कभी नहीं किया जा सकता है - लेकिन जब तक आपका डीबी लेखन-भारी भार नहीं देखता है तब तक प्रदर्शन अतिरिक्त इंडेक्स के साथ भी बुरी तरह से बदबू नहीं जा रहा है।

अक्सर पूछे जाने वाले प्रश्नों के लिए विशिष्ट सूचकांक जो अन्यथा टेबल या इंडेक्स स्कैनिंग के कारण धीमा हो जाएगा, आमतौर पर एक अच्छा विचार है, हालांकि इसे ज़्यादा मत करो क्योंकि आप दूसरे के लिए एक प्रदर्शन मुद्दे का आदान-प्रदान कर सकते हैं। यदि आप [customerId], [dateCreated]एक इंडेक्स के रूप में परिभाषित करते हैं , उदाहरण के लिए, याद रखें कि क्वेरी प्लानर उन प्रश्नों के लिए उपयोग करने में सक्षम होगा जो [customerId]वर्तमान में एक इंडेक्स का उपयोग करेंगे । जबकि [customerId]कंपाउंड इंडेक्स का उपयोग करने की तुलना में बस थोड़ा अधिक कुशल होगा, यह एक के बजाय रैम में अंतरिक्ष के लिए प्रतिस्पर्धा करने वाले दो इंडेक्स को समाप्त करके कम किया जा सकता है (हालांकि यदि आपका पूरा सामान्य कामकाजी सेट रैम में आसानी से फिट हो जाता है तो यह अतिरिक्त मेमोरी प्रतियोगिता नहीं हो सकता है एक मुद्दा)।


+1; महान जानकारी, विशेष रूप से अनुस्मारक (जो मैं भूल जाता हूं!) कि योजनाकार कई बार एक यौगिक सूचकांक का उपयोग कर सकता है जब उसे क्वेरी के लिए केवल पहले फ़ील्ड (ओं) की आवश्यकता होती है।
एंड्रयू बार्बर

6

अपने मूल प्रश्न का उत्तर देने के लिए, हां, इंडेक्स को प्रश्नों के चारों ओर डिज़ाइन करना होगा , न कि केवल तालिका । सूचकांक में क्षेत्रों का क्रम महत्वपूर्ण रूप से महत्वपूर्ण है। एक ही सूचकांक को कई प्रश्नों के लिए इष्टतम बनाना कठिन है, और आपको व्यापार बंद करना होगा।

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

अनुक्रमित करने के लिए मेरी रणनीति, सूचकांक के लिए है:

  • WHERE में प्रयुक्त फ़ील्ड (चयनात्मकता के क्रम में)
  • ORDER BY में प्रयुक्त फ़ील्ड्स
  • एक कवरिंग इंडेक्स बनाने के लिए अन्य क्षेत्रों (यदि आवश्यक हो) को शामिल करें

तो आपके उदाहरण के लिए:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

मैं शायद एक सूचकांक (CustomerID, दिनांकित) INCLUDE (आईडी, नाम) पर एक डिजाइन तैयार करूंगा। इस कवरिंग इंडेक्स का मतलब है कि क्वेरी को कभी भी मूल तालिका में नहीं आना चाहिए, इससे प्रदर्शन में सुधार होगा।

यह उदाहरण लगभग बहुत सरल है, यद्यपि। बस (ग्राहक) पर एक भोली सूचकांक लगभग (साथ ही यह मानते हुए कि प्रत्येक ग्राहक के पास केवल एक प्रतिनिधि है, इसलिए तालिका में केवल एक ही बुकमार्क की आवश्यकता होगी)। यह वास्तव में तालिका के विरुद्ध अन्य प्रश्नों के आधार पर (ग्राहक आईडी) पर एक संकुल सूचकांक करने के लिए भी फायदेमंद हो सकता है ।


+1 के लिए "अनुक्रमित प्रश्नों के चारों ओर डिज़ाइन किया जाना चाहिए, न कि केवल तालिका" और शेष उत्तर, जैसे कि यह देखते हुए कि उदाहरण बहुत सरल है।
एंड्रयू बार्बर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.