2008-09-22 20 views
85

MySQL की व्याख्या आउटपुट बहुत सरल है। PostgreSQL एक और अधिक जटिल है। मैं एक अच्छा संसाधन खोजने में सक्षम नहीं हूं जो इसे समझाता है।PostgreSQL मुझे बिल्कुल बताते हुए क्या समझाता है?

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

उत्तर

47

Explaining_EXPLAIN.pdf भी मदद कर सकता है।

+28

मुझे रहस्य है कि लोग क्यों सोचते हैं कि स्लाइड डेक अच्छे तकनीकी दस्तावेज़ीकरण करते हैं। बात का एक वीडियो सहायक हो सकता है, लेकिन उस स्लाइड डेक की जानकारी घनत्व शून्य के बहुत करीब है। पहली छः स्लाइड्स (कुल में से 1/5 वां) में, तकनीकी सामग्री की बिल्कुल 1 वाक्य है: "• किसी भी डीएमएल पर एक्सप्लाइन काम करता है न केवल चयन (यानी अद्यतन, हटाएं, और INSERT)"। मेरी सबसे बड़ी गलतफहमी यह है कि "स्टार्टअप" का मतलब क्या है, और इन ~ 30 स्लाइड्स में कहीं भी यह समझाया नहीं गया है। –

36

यह सबसे इंडेंट से कम से कम इंडेंट से निष्पादित होता है, और मैं योजना के निचले भाग से ऊपर तक विश्वास करता हूं। (इसलिए यदि दो इंडेंटेड अनुभाग हैं, तो पृष्ठ के आगे एक निष्पादन पहले निष्पादित होता है, फिर जब वे अन्य निष्पादन को पूरा करते हैं, तो उन्हें शामिल करने का नियम निष्पादित होता है।)

विचार यह है कि प्रत्येक चरण में 1 या 2 होते हैं डेटासेट जो कुछ नियमों से आते हैं और संसाधित होते हैं। यदि केवल एक डेटासेट है, तो उस डेटा सेट पर वह ऑपरेशन किया जाता है। (उदाहरण के लिए, आप कौन सी पंक्तियां चाहते हैं, डेटासेट फ़िल्टर करें या इसे सॉर्ट करें।) यदि दो, दो डेटासेट दो चीजें हैं जो आगे इंडेंट हैं, और वे आपके द्वारा देखे जाने वाले नियम से जुड़ जाते हैं। अधिकांश नियमों का अर्थ उचित रूप से आसानी से अनुमान लगाया जा सकता है (विशेष रूप से यदि आपने पहले समझाया गया योजनाओं का एक समूह पढ़ा है), हालांकि आप केवल वाक्यांश को फेंक कर दस्तावेज या (आसान) में देखकर अलग-अलग आइटमों को सत्यापित करने का प्रयास कर सकते हैं EXPLAIN जैसे कुछ कीवर्ड के साथ Google।

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

explain analyze 
select a.attributeid, a.attributevalue, b.productid 
from orderitemattribute a, orderitem b 
where a.orderid = b.orderid 
and a.attributeid = 'display-album' 
and b.productid = 'ModernBook'; 

------------------------------------------------------------------------------------------------------------------------------------------------------------ 

Merge Join (cost=125379.14..125775.12 rows=3311 width=29) (actual time=841.478..841.478 rows=0 loops=1) 
    Merge Cond: (a.orderid = b.orderid) 
    -> Sort (cost=109737.32..109881.89 rows=57828 width=23) (actual time=736.163..774.475 rows=16815 loops=1) 
     Sort Key: a.orderid 
     Sort Method: quicksort Memory: 1695kB 
     -> Bitmap Heap Scan on orderitemattribute a (cost=1286.88..105163.27 rows=57828 width=23) (actual time=41.536..612.731 rows=16815 loops=1) 
       Recheck Cond: ((attributeid)::text = 'display-album'::text) 
       -> Bitmap Index Scan on (cost=0.00..1272.43 rows=57828 width=0) (actual time=25.033..25.033 rows=16815 loops=1) 
        Index Cond: ((attributeid)::text = 'display-album'::text) 
    -> Sort (cost=15641.81..15678.73 rows=14769 width=14) (actual time=14.471..16.898 rows=1109 loops=1) 
     Sort Key: b.orderid 
     Sort Method: quicksort Memory: 76kB 
     -> Bitmap Heap Scan on orderitem b (cost=310.96..14619.03 rows=14769 width=14) (actual time=1.865..8.480 rows=1114 loops=1) 
       Recheck Cond: ((productid)::text = 'ModernBook'::text) 
       -> Bitmap Index Scan on id_orderitem_productid (cost=0.00..307.27 rows=14769 width=0) (actual time=1.431..1.431 rows=1114 loops=1) 
        Index Cond: ((productid)::text = 'ModernBook'::text) 
Total runtime: 842.134 ms 
(17 rows) 

इसे अपने लिए पढ़ने का प्रयास करें और देखें कि यह समझ में आता है या नहीं।

क्या मैंने पढ़ा है कि डेटाबेस पहले id_orderitem_productid सूचकांक को स्कैन करता है, कि का उपयोग कर तो प्रकार है कि एक quicksort का उपयोग कर डाटासेट पंक्तियों यह orderitem से चाहता है, मिल रहा है (तरह अगर डेटा रैम में फिट नहीं करता है बदल जाएगा प्रयोग किया जाता) , फिर उस तरफ सेट करता है।

अगला, यह orditematt_attributeid_idx स्कैन करता है जो orderitemattribute से पंक्तियों को ढूंढने के लिए स्कैन करता है और उसके बाद उस डेटासेट को एक quicksort का उपयोग करता है।

फिर यह दो डेटासेट लेता है और उन्हें विलय करता है। (एक मर्ज जॉइन एक प्रकार का "ज़िपिंग" ऑपरेशन है जहां यह समानांतर में दो क्रमबद्ध डेटासेट चलाता है, जब वे मिलान करते हैं तो शामिल पंक्ति को उत्सर्जित करते हैं।)

जैसा कि मैंने कहा था, आप आंतरिक भाग को बाहरी भाग में योजना के माध्यम से काम करते हैं, नीचे से ऊपर।

13

PgAdmin आपको समझाया योजना का एक ग्राफिकल प्रतिनिधित्व दिखाएगा। दोनों के बीच आगे और पीछे स्विच करने से वास्तव में आपको समझने में मदद मिल सकती है कि पाठ का प्रतिनिधित्व क्या है। हालांकि, अगर आप जानना चाहते हैं कि यह क्या करने जा रहा है, तो आप हमेशा जीयूआई का उपयोग करने में सक्षम हो सकते हैं।

15

एक ऑनलाइन सहायक उपकरण भी उपलब्ध है, Depesz, जो विश्लेषण परिणामों के महंगे हिस्सों को हाइलाइट करेगा।

में भी एक है, यहां same results है, जो मुझे समस्या के बारे में स्पष्ट बनाता है।

+18

व्याख्या-analyze.info नीचे प्रतीत होता है, लेकिन मुझे लगता है कि http://explain.depesz.com/ बहुत उपयोगी है। – benvolioT

+1

http://explain.depesz.com बहुत उपयोगी था, खासकर "आंकड़े" टैब। –

0

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

6

PostgreSQL's official documentation व्याख्यान के आउटपुट को समझने के तरीके पर एक दिलचस्प, पूरी तरह से स्पष्टीकरण प्रदान करता है।

24

जो हिस्सा मैं हमेशा उलझन में पाया वह स्टार्टअप लागत बनाम कुल लागत है। मैं इसे हर बार भूल जाता हूं, जो मुझे यहां वापस लाता है, जो अंतर को समझाता नहीं है, यही कारण है कि मैं यह जवाब लिख रहा हूं। यह है कि मैंने Postgres EXPLAIN documentation, से समझाया है जैसा कि मैंने इसे समझा है।

EXPLAIN SELECT * FROM post LIMIT 50; 

Limit (cost=0.00..3.39 rows=50 width=422) 
    -> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422) 

यहाँ pgAdmin से चित्रमय व्याख्या दी गई है:

यहाँ एक आवेदन है कि एक मंच का प्रबंधन करता है से एक उदाहरण है

graphical explanation of first query

(जब आप pgAdmin उपयोग कर रहे हैं, आप कर सकते हैं लागत विवरण पढ़ने के लिए अपने माउस को एक घटक पर इंगित करें।)

लागत को टुपल के रूप में दर्शाया गया है, उदाहरण के लिए LIMIT की लागत cost=0.00..3.39 है और post अनुक्रमिक रूप से स्कैनिंग की लागत cost=0.00..15629.12 है। टुपल में पहला नंबर स्टार्टअप लागत है और दूसरा नंबर कुल लागत है। क्योंकि मैंने EXPLAIN और EXPLAIN ANALYZE का उपयोग नहीं किया, इसलिए ये लागत अनुमानित हैं, वास्तविक उपाय नहीं।

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

एक जटिलता के रूप में, प्रत्येक "पैरेंट" नोड की लागत में उसके बच्चे नोड्स की लागत शामिल होती है। पाठ प्रतिनिधित्व में, पेड़ इंडेंटेशन द्वारा प्रतिनिधित्व किया जाता है, उदा। LIMIT एक मूल नोड है और Seq Scan उसका बच्चा है। PgAdmin प्रतिनिधित्व में, तीर बच्चे से माता-पिता को इंगित करते हैं - डेटा के प्रवाह की दिशा - जो कि यदि आप ग्राफ सिद्धांत से परिचित हैं तो counterintuitive हो सकता है।

प्रलेखन का कहना है कि लागत सभी बच्चे नोड्स शामिल हैं, लेकिन ध्यान दें कि माता-पिता की कुल लागत 3.39 अपने बच्चे की कुल लागत 15629.12 से बहुत छोटी है। कुल लागत समावेशी नहीं है क्योंकि LIMIT जैसे घटक को अपने पूरे इनपुट को संसाधित करने की आवश्यकता नहीं है। उदाहरण Postgres EXPLAIN documentation में देखें।

उपर्युक्त उदाहरण में, स्टार्टअप समय दोनों घटकों के लिए शून्य है, क्योंकि किसी भी घटक को पंक्तियों को लिखना शुरू करने से पहले कोई प्रसंस्करण करने की आवश्यकता नहीं होती है: अनुक्रमिक स्कैन तालिका की पहली पंक्ति को पढ़ता है और इसे उत्सर्जित करता है। LIMIT अपनी पहली पंक्ति पढ़ता है और फिर इसे छोड़ देता है।

किसी घटक को किसी भी पंक्ति को आउटपुट करने से पहले कितनी प्रसंस्करण करने की आवश्यकता होगी?बहुत सारे संभावित कारण हैं, लेकिन चलिए एक स्पष्ट उदाहरण देखें।

EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50; 

Limit (cost=23283.24..23283.37 rows=50 width=422) 
    -> Sort (cost=23283.24..23859.27 rows=230412 width=422) 
     Sort Key: body 
     -> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422) 

और रेखांकन:: यहाँ से पहले, लेकिन अब एक ORDER BY खंड युक्त से ही क्वेरी है एक बार फिर

graphical explanation of second query

, post पर अनुक्रमिक स्कैन कोई स्टार्टअप लागत है: यह तुरंत पंक्तियों outputting शुरू होता है । लेकिन इस तरह की एक महत्वपूर्ण स्टार्टअप लागत 23283.24 है क्योंकि इसे पूरे टेबल को सॉर्ट करने से पहले यह एक पंक्ति को भी आउटपुट कर सकता है। 23859.27 की कुल लागत स्टार्टअप लागत से थोड़ी अधिक है, इस तथ्य को दर्शाती है कि एक बार पूरे डेटासेट को सॉर्ट करने के बाद, सॉर्ट किए गए डेटा को बहुत जल्दी उत्सर्जित किया जा सकता है।

ध्यान दें कि LIMIT23283.24 का स्टार्टअप समय इस प्रकार के स्टार्टअप समय के बराबर है। ऐसा इसलिए नहीं है क्योंकि LIMIT में एक उच्च स्टार्टअप समय है। यह वास्तव में शून्य स्टार्टअप समय है, लेकिन EXPLAIN प्रत्येक माता-पिता के लिए सभी बच्चे की लागत को बढ़ाता है, इसलिए LIMIT स्टार्टअप समय में अपने बच्चों के योग स्टार्टअप समय शामिल हैं।

लागतों का यह रोलअप प्रत्येक व्यक्तिगत घटक की निष्पादन लागत को समझना मुश्किल हो सकता है। उदाहरण के लिए, हमारे LIMIT में शून्य स्टार्टअप समय है, लेकिन यह पहली नज़र में स्पष्ट नहीं है। इस कारण से, explain.depesz.com से जुड़े कई अन्य लोग, हबर्ट लुबैज़वेस्की (ए.के.ए. डेपेज) द्वारा निर्मित एक उपकरण जो अन्य चीजों के साथ EXPLAIN को समझने में मदद करता है - मूल लागत से बच्चे की लागत घटाना। उन्होंने अपने उपकरण के बारे में a short blog post में कुछ अन्य जटिलताओं का उल्लेख किया है।

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