2009-09-09 11 views
6

एटीएम मैं सीखने की कोशिश कर रहा हूं कि डाटाबेस इनडिसेस का कुशलतापूर्वक उपयोग कैसे करें और कुछ विशेषज्ञ इनपुट प्राप्त करने की सराहना करेंगे। मेरे पास वर्तमान में कोई प्रदर्शन समस्या नहीं है। सामान्य रूप से मैं सूचकांक डाल (A.eventइस क्वेरी को कैसे तेज करें?

SELECT B.event, 
     COALESCE(B.system, C.surname || ' ' || C.forename) AS name, 
     C.label, 
     B.timestamp 
FROM A    
    INNER JOIN B ON A.event=B.event 
    INNER JOIN C ON B.state=C.id 
    LEFT OUTER JOIN D ON B.hur=D.id    
WHERE A.id IN(12,13,14,15,...) 
    ORDER BY B.event, B.timestamp 

A.id, C.id और D.id पहले से ही प्राथमिक कुंजी

अद्यतन कर रहे हैं: मैं बस पता करने के लिए, आप कैसे इस क्वेरी के साथ अपने सूचकांक संभाल होगा चाहते हैं) और इंडेक्स (बीवेन्ट, बी। टिमस्टैम्प)। क्या ये सही है? और बीवेन्ट, बीस्टेट और बीएचयूआर के बारे में क्या?

+0

सही, लेकिन जांचें कि वास्तव में B.timestamp का उपयोग किया जाएगा या नहीं। – Pomyk

+0

प्रत्येक तालिका में कितने बड़े हैं, और आप किसी दिए गए प्रश्न से कितनी पंक्तियों से मिलान करने की उम्मीद करेंगे। आप किस डेटाबेस का उपयोग कर रहे हैं? –

+0

साथ ही, तालिका में डेटा कितनी बार जोड़ा जाता है और आप क्वेरी को कितनी बार चलाने के लिए चाहते हैं? –

उत्तर

3

इस रूप में आपकी क्वेरी पुनर्लेखन:

SELECT B.event, 
     COALESCE(B.system, C.surname || ' ' || C.forename) AS name, 
     C.label, 
     B.timestamp 
FROM B    
INNER JOIN 
     C 
ON  C.id = B.state 
LEFT OUTER JOIN 
     D 
ON  D.id = B.hur 
WHERE B.event IN 
     (
     SELECT event 
     FROM A 
     WHERE A.id IN (12, 13, 14, 15) 
     ) 
ORDER BY 
     B.event, B.timestamp 

, और B (event, timestamp)

2

आप कहां से कहां और ऑर्डर में सबकुछ में इंडेक्स जोड़ सकते हैं। आई एवेन्ट, बीवेन्ट और बी। टिमस्टैम्प।

+1

अंधाधुंध इंडेक्स को न जोड़ें। लिवन का जवाब देखें। सूचकांक जोड़ें अंधेरे प्रदर्शन को चोट पहुंचा सकता है क्योंकि प्रत्येक इंडेक्स को बनाए रखने की आवश्यकता होती है। कुछ मामलों में छोटी टेबलों की तरह यह चोट पहुंच जाएगी क्योंकि आईओ को बनाए रखने के लिए इस्तेमाल किया जा सकता है कहीं और इस्तेमाल किया जा सकता है। कभी-कभी एक छोटी तालिका पर एक पूर्ण टेबल स्कैन इंडेक्स से बेहतर होता है। – jim

+0

मैं अपना जवाब हटाने का लुत्फ उठा रहा हूं; हालांकि, जिम की टिप्पणी उपयोगी जानकारी है, तो क्या जवाब छोड़ा जाना चाहिए? – darasd

0
SELECT B.event, B.system, COALESCE(C.surname) || ' ' || COALESCE(C.forename) AS name, C.label, B.timestamp 
FROM A    
INNER JOIN B ON A.event=B.event 
INNER JOIN C ON B.state=C.id 
LEFT OUTER JOIN D ON B.hur=D.id    
WHERE A.event = ANY(:visits) 
ORDER BY B.event, B.timestamp 

इसके अलावा ऑर्डर बी चीजों को बुरी तरह धीमा कर देगा। सुनिश्चित करें कि इन अनुक्रमित कर रहे हैं:

A.event 
B.event 
B.state 
C.id 
B.timestamp 
3

मेरे प्रश्नों

  1. तेजी लाने के लिए कार्य योजना लागू करके विश्लेषण की कोशिश कर रहा है जब मैं आम तौर पर इन कदम उठाते हैं।
  2. टेबल स्कैन को खत्म करने के लिए इंडेक्स बनाने (कवर) करने का प्रयास करें।
  3. इंडेक्स स्कैन को खत्म करने के लिए इंडेक्स बनाने (कवर) करने का प्रयास करें।

के लिए के रूप में आप क्वेरी, आप पर

  • A.event बनाने सूचकांक गलत नहीं होगा
  • B.event
  • B.state
  • B.Hur
+0

बीवेन्ट और बीस्टेट के लिए पृथक इंडेक्स बनाना (बीवेन्ट, बीस्टेट) पर एक इंडेक्स बनाने जैसा नहीं है। इसे अलग करना महत्वपूर्ण है क्योंकि इसका प्रदर्शन पर प्रत्यक्ष प्रभाव पड़ता है। – MatBailie

+0

@Dems: अगर यह मेरे जवाब में अस्पष्ट छोड़ दिया गया था, तो आप सही हैं। –

1

मैं उस खंड में या खंड द्वारा क्रम में शामिल होने वाली किसी भी चीज में इंडेक्स जोड़ दूंगा।

  1. A.event
  2. B.event
  3. B.state
  4. बी:

    इस मामले में निम्न में से अनुक्रमित जोड़ने (यह मानते हुए आईडी क्षेत्रों प्राथमिक कुंजी और पहले से अनुक्रमित कर रहे हैं) हर

  5. B.event, B.timestamp (दोनों क्षेत्रों के संयुक्त सूचकांक)

इंडेक्स संयोजन होने वाला 5 वां, ऑर्डर को तेज करना चाहिए।

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

2

पर एक समग्र सूचकांक बनाने यह ध्यान रखें कि सूचकांक में खेतों के क्रम महत्वपूर्ण है महत्वपूर्ण है।

एक सूचकांक, एक अर्थ में, एक खोज पेड़ है। यदि आप इंडेक्स (बीवेन्ट, बीस्टेट) इंडेक्स करते हैं तो पेड़ "ईवेंट" फ़ील्ड के साथ सभी रिकॉर्ड एक साथ समूह करेगा, फिर उन्हें "राज्य" फ़ील्ड द्वारा ऑर्डर करें।

यदि आप उस सूचकांक को "b.state = x" के लिए क्वेरी करने के लिए थे, तो सूचकांक का उपयोग बहुत कम होगा; सूचकांक पहले "घटना" द्वारा आदेश दिया जाता है।


अपने उदाहरण में:
- फिल्टर यह द्वारा एक है "घटना" क्षेत्र
- A.event में शामिल होने B.event को
- C.id
को B.state में शामिल होने के - शामिल हों B.hur = D.id
- B.event द्वारा आदेश, B.timestamp

ऐसा नहीं है कि अनुकूलन अपने टेबल, और अनुक्रमित के आंकड़ों पर नजर डालेंगे ध्यान देना महत्वपूर्ण है, तो हो सकता है के आदेश फिर से व्यवस्थित जोड़ता है नतीजा वही होगा, लेकिन ऑर्डर अलग प्रदर्शन दे सकता है, और ऑप्टिमाइज़र नौकरी सर्वश्रेष्ठ प्रदर्शन को खोजने का प्रयास करना है।

आपके मामले में मैं बीवेन्ट के आदेश को अत्यंत महत्वपूर्ण होने की अपेक्षा करता हूं। बस क्योंकि यह परिणामी आउटपुट का ऑर्डर है, और यह वह फ़ील्ड है जिसे आप फ़िल्टर करते हैं।

अगला आप बीस्टेट से सीआईडी ​​में शामिल हो जाते हैं। तो सीआईडी ​​पर होने और अनुक्रमण अच्छा है, यह तेजी से जुड़ता है। लेकिन समान रूप से, बी टेबल डेटा को एक अच्छे क्रम में रखने से भी तेजी से जुड़ सकते हैं।

लेकिन, बीवेन्ट पर एक सूचकांक और बीस्टेट पर एक अलग इंडेक्स होने से थोड़ा कम हो सकता है। बीस्टेट इंडेक्स व्यर्थ के बगल में आता है क्योंकि हम बीवेन्ट इंडेक्स का उपयोग कर रहे हैं। यदि आप दोनों को एक इंडेक्स में जोड़ते हैं (b.event तो b.state) निष्पादन योजना इंडेक्स के b.state भाग का उपयोग करने का एक तरीका ढूंढ सकती है।

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

मैं अब Wittering हूँ, लेकिन सार है यह:
- आमतौर पर, अलग क्षेत्रों पर अलग सूचकांक एक साथ
आदत हो नहीं है - समग्र अनुक्रमित के लिए, आपको फ़ील्ड को निर्दिष्ट एक फर्क नहीं पड़ता
- इंडेक्स में 'अतिरिक्त' फ़ील्ड जोड़ना इसे बड़ा बनाता है, लेकिन प्रश्नों को तेज़ी से भी बना सकता है
- निष्पादन योजना का क्रम आपकी क्वेरी के आदेश से अधिक मायने रखता है
- लेकिन आपके पास मौजूद इंडेक्स का ऑर्डर निर्धारित कर सकता है निष्पादन योजना

इस तरह के काम में है कोई स्पष्ट जवाब नहीं। यह आपके डेटा पर निर्भर है कि यह एक कला के करीब है।

एक विकल्प इंडेक्स के साथ तालिकाओं को लोड करने के लिए है, परिणामस्वरूप निष्पादन योजना को देखें, और आवश्यक इंडेक्स को हटा दें।

लेकिन यहां तक ​​कि एक चेतावनी लागू होती है। चूंकि निष्पादन योजना डेटा (और तालिका आंकड़े) निर्भर है, इसलिए टेबल में वास्तविक विश्व डेटा होना बहुत महत्वपूर्ण है। जबकि तालिकाओं में 10 'या 100 पंक्तियां हैं, एक निष्पादन योजना सबसे तेज़ हो सकती है। लेकिन जब आपको लाखों पंक्तियां मिलती हैं तो निष्पादन योजना बदल सकती है, और विभिन्न इंडेक्स से लाभ होता है।

2

क्वेरी के विश्लेषण की व्याख्या करें, और इसे पढ़ें - अगर यह मदद नहीं करता है - explain.depesz.com पर विश्लेषण का विश्लेषण करें और यह कहें कि यह "कहता है"।

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