मुख्य सामग्री पर जाएं
मॉड्यूल 10 · पाठ 2 का 4पाठ्यक्रम में 38/57~15 min
मॉड्यूल पाठ (2/4)

समझाएं और विश्लेषण करें

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

लेकिन एक डेवलपर के रूप में, आपको क्वेरी प्लानर के अंधेरे दिमाग के अंदर देखने में सक्षम होना चाहिए।

व्याख्या करना

यह जानने के लिए कि प्लानर कैसे आगे बढ़ना चाहता है, बस अपनी क्वेरी की शुरुआत में जादुई शब्द EXPLAIN डालें।

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

परिणाम आदेश नहीं होगा! इसके बजाय, आप आउटपुट में योजना देखेंगे (अनुमानित आंकड़ों के साथ):

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

यह हमें बताता है:

  1. प्लानर एक Seq स्कैन (संपूर्ण डिस्क का स्पष्ट, अनुक्रमिक रीड) का उपयोग करेगा। यदि अरबों ऑर्डर हों तो बुरा है।
  2. यह अनुमान लगाता है कि ~15 पंक्तियाँ वापस आ जाएंगी, और प्री-लोडेड सीपीयू चक्रों में "लागत" की गणना करता है।

समझाइये विश्लेषण कीजिये

जबकि EXPLAIN एल्गोरिथम अनुमानों (डेटा पर पिछले कुछ घंटों में गणना किए गए वैश्विक आंकड़ों के आधार पर) पर निर्भर करता है, EXPLAIN ANALYZE वास्तव में वास्तविक के लिए क्वेरी चलाता है (और पूर्ण तार्किक परिणामों की प्रतीक्षा करता है), गणितीय रूप से निरपेक्ष रूप से वास्तविक बीता हुआ समय की तुलना करता है।

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
Index Scan using idx_orders_cust on orders  (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
  Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 ms

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

आपकी बारी

व्यायाम#sql.m10.l2.e1
प्रयास: 0लोड हो रहा है...

यह जानने के लिए एक बुनियादी EXPLAIN कमांड लिखें कि PostgreSQL 10 इकाइयों से कम मौजूदा स्टॉक वाले उत्पादों को कैसे ढूंढना चाहता है। (इस चरण में ANALYZE का उपयोग न करें।)

संपादक लोड हो रहा है...
संकेत दिखाएँ

मौजूदा कथन की शुरुआत में बस EXPLAIN शब्द जोड़ें।

3 प्रयासों के बाद समाधान उपलब्ध है

सच्चे मेट्रिक्स प्राप्त करना

व्यायाम#sql.m10.l2.e2
प्रयास: 0लोड हो रहा है...

हम एक वास्तविक प्रदर्शन निदान (समय और चक्र) चाहते हैं, न कि गणितीय रूप से अनुमानित स्केच।\nवास्तव में इसे चलाकर अध्ययन करने के लिए समर्पित कथन का उपयोग करें, 1 जनवरी 2025 से पहले साइन अप किए गए सभी 'ग्राहकों' का लुकअप ('signed_up_on' < '2025-01-01')।

संपादक लोड हो रहा है...
संकेत दिखाएँ

EXPLAIN के ठीक बाद ANALYZE शब्द जोड़ें।

3 प्रयासों के बाद समाधान उपलब्ध है