जो हिस्सा मैं हमेशा उलझन में पाया वह स्टार्टअप लागत बनाम कुल लागत है। मैं इसे हर बार भूल जाता हूं, जो मुझे यहां वापस लाता है, जो अंतर को समझाता नहीं है, यही कारण है कि मैं यह जवाब लिख रहा हूं। यह है कि मैंने 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 से चित्रमय व्याख्या दी गई है:
यहाँ एक आवेदन है कि एक मंच का प्रबंधन करता है से एक उदाहरण है
(जब आप 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
खंड युक्त से ही क्वेरी है एक बार फिर
, post
पर अनुक्रमिक स्कैन कोई स्टार्टअप लागत है: यह तुरंत पंक्तियों outputting शुरू होता है । लेकिन इस तरह की एक महत्वपूर्ण स्टार्टअप लागत 23283.24
है क्योंकि इसे पूरे टेबल को सॉर्ट करने से पहले यह एक पंक्ति को भी आउटपुट कर सकता है। 23859.27
की कुल लागत स्टार्टअप लागत से थोड़ी अधिक है, इस तथ्य को दर्शाती है कि एक बार पूरे डेटासेट को सॉर्ट करने के बाद, सॉर्ट किए गए डेटा को बहुत जल्दी उत्सर्जित किया जा सकता है।
ध्यान दें कि LIMIT
23283.24
का स्टार्टअप समय इस प्रकार के स्टार्टअप समय के बराबर है। ऐसा इसलिए नहीं है क्योंकि LIMIT
में एक उच्च स्टार्टअप समय है। यह वास्तव में शून्य स्टार्टअप समय है, लेकिन EXPLAIN
प्रत्येक माता-पिता के लिए सभी बच्चे की लागत को बढ़ाता है, इसलिए LIMIT
स्टार्टअप समय में अपने बच्चों के योग स्टार्टअप समय शामिल हैं।
लागतों का यह रोलअप प्रत्येक व्यक्तिगत घटक की निष्पादन लागत को समझना मुश्किल हो सकता है। उदाहरण के लिए, हमारे LIMIT
में शून्य स्टार्टअप समय है, लेकिन यह पहली नज़र में स्पष्ट नहीं है। इस कारण से, explain.depesz.com से जुड़े कई अन्य लोग, हबर्ट लुबैज़वेस्की (ए.के.ए. डेपेज) द्वारा निर्मित एक उपकरण जो अन्य चीजों के साथ EXPLAIN
को समझने में मदद करता है - मूल लागत से बच्चे की लागत घटाना। उन्होंने अपने उपकरण के बारे में a short blog post में कुछ अन्य जटिलताओं का उल्लेख किया है।
मुझे रहस्य है कि लोग क्यों सोचते हैं कि स्लाइड डेक अच्छे तकनीकी दस्तावेज़ीकरण करते हैं। बात का एक वीडियो सहायक हो सकता है, लेकिन उस स्लाइड डेक की जानकारी घनत्व शून्य के बहुत करीब है। पहली छः स्लाइड्स (कुल में से 1/5 वां) में, तकनीकी सामग्री की बिल्कुल 1 वाक्य है: "• किसी भी डीएमएल पर एक्सप्लाइन काम करता है न केवल चयन (यानी अद्यतन, हटाएं, और INSERT)"। मेरी सबसे बड़ी गलतफहमी यह है कि "स्टार्टअप" का मतलब क्या है, और इन ~ 30 स्लाइड्स में कहीं भी यह समझाया नहीं गया है। –