क्या आप जानना चाहते हैं कि PostgreSQL क्वेरी धीमी क्यों है? फिर EXPLAIN ANALYZE एक बेहतरीन शुरुआत है। लेकिन क्वेरी प्लान अन्य सर्वर गतिविधि पर निर्भर हो सकते हैं, चलने में कुछ समय ले सकते हैं, और समय के साथ बदल सकते हैं, इसलिए यदि आप अपने सबसे धीमे प्रश्नों की वास्तविक निष्पादन योजना देखना चाहते हैं, तो auto_explain वह टूल है जिसकी आपको आवश्यकता है। इस पोस्ट में, हम देखेंगे कि यह क्या करता है, इसे कैसे कॉन्फ़िगर करें, और अपने प्रश्नों को तेज करने के लिए उन लॉग का उपयोग कैसे करें।
auto_explain क्या है?
auto_explain एक PostgreSQL एक्सटेंशन है जो आपको (कॉन्फ़िगर करने योग्य) थ्रेशोल्ड से धीमी क्वेरी के लिए क्वेरी प्लान लॉग करने की अनुमति देता है। यह धीमी क्वेरी डीबग करने के लिए अविश्वसनीय रूप से उपयोगी है, विशेष रूप से वे जो केवल कभी-कभी समस्याग्रस्त होते हैं। यह योगदान मॉड्यूल में से एक है, इसलिए इसे नियमित PostgreSQL पर आसानी से स्थापित और कॉन्फ़िगर किया जा सकता है, और यह इतना उपयोगी है कि हमारे पास इसे स्केलग्रिड पर डिफ़ॉल्ट रूप से है।
ऑटो_एक्सप्लेन (कमिट, थ्रेड) के पहले संस्करण के मुख्य लेखक ताकाहिरो इतागाकी को बहुत-बहुत धन्यवाद, डीन रशीद, जिनके शुरुआती पैच और सुझाव पर यह आधारित था, और कई तब से इसमें योगदानकर्ता और समीक्षक हैं।
मुझे कौन से auto_explain पैरामीटर का उपयोग करना चाहिए?
नीचे हम सबसे महत्वपूर्ण मापदंडों पर चर्चा करेंगे, लेकिन कृपया नीचे दी गई तालिका, या आधिकारिक दस्तावेज की समीक्षा करें, ताकि आप ट्रैक की जा सकने वाली चीजों की पूरी श्रृंखला के बारे में अधिक जानकारी प्राप्त कर सकें।पी>
auto_explain के लिए सबसे महत्वपूर्ण पैरामीटर log_min_duration
है . डिफ़ॉल्ट रूप से यह -1
. पर सेट होता है , जिसका अर्थ है कि कुछ भी लॉग नहीं किया जाएगा - इसलिए यदि हम कुछ लॉग चाहते हैं तो हमें इसे बदलने की आवश्यकता है! डिफ़ॉल्ट इकाई एमएस है, इसलिए 100
. की एक सेटिंग 100ms से अधिक के सभी प्रश्नों के लिए क्वेरी प्लान लॉग करेगा। इसे हमने स्केलग्रिड में डिफ़ॉल्ट के रूप में चुना है, लेकिन इसे Admin -> Config के तहत कॉन्फ़िगर किया जा सकता है। यदि, किसी कारण से, आप प्रत्येक क्वेरी के लिए क्वेरी प्लान लॉग करना चाहते हैं, तो आप इसे 0
पर सेट कर सकते हैं - लेकिन सावधान रहें, इससे प्रदर्शन पर गंभीर प्रभाव पड़ सकते हैं।
चूंकि क्वेरी पहले से ही सर्वर पर निष्पादित की जा रही हैं, आप शायद auto_explain.log_analyze
को भी सक्षम करना चाहते हैं . यह आउटपुट को EXPLAIN ANALYZE
running चलाने के बराबर बनाता है . डिफ़ॉल्ट रूप से, इसका अर्थ यह भी है कि प्रति-ऑपरेशन समय ट्रैक किए जाते हैं। यह कुछ अतिरिक्त ओवरहेड के साथ आता है, जिसे auto_explain.log_timeing
को बंद करके कम किया जा सकता है (डिफ़ॉल्ट रूप से log_analyze
. के साथ चालू होता है ) स्वाभाविक रूप से, धीमी क्वेरी डीबग करते समय प्रति-ऑपरेशन समय बहुत उपयोगी होते हैं! हमारे आंतरिक परीक्षण ने इसके लिए स्वीकार्य ओवरहेड दिखाया, इसलिए यह स्केलग्रिड में डिफ़ॉल्ट रूप से चालू है, लेकिन हमेशा की तरह कृपया अपने कार्यभार का परीक्षण करके देखें कि क्या आपके मामले में ओवरहेड स्वीकार्य है। वर्तमान में इस विषय पर सार्वजनिक रूप से उपलब्ध जानकारी सीमित है, लेकिन पीजी मस्टर्ड टीम की एक हालिया पोस्ट से पता चला है कि, कम से कम एक छोटे से लेन-देन के कार्यभार पर, ओवरहेड 2% जितना कम हो सकता है। जैसा कि उन्होंने बताया, इसे auto_explain.sample_rate
. से कम किया जा सकता है पैरामीटर, केवल आपकी क्वेरी के एक सबसेट को ट्रैक करने की कीमत पर।
जिस अंतिम पैरामीटर पर हम थोड़ा विस्तार से चर्चा करेंगे, वह है auto_explain.log_format
. डिफ़ॉल्ट आउटपुट टेक्स्ट है, जो संभवत:EXPLAIN
के उपयोग से आप सबसे अधिक परिचित हैं। ।
यहां एक सरल उदाहरण दिया गया है कि टेक्स्ट प्रारूप में auto_explain आउटपुट कैसा दिख सकता है:
2021-09-10 15:32:04.606 BST [22770] LOG: duration: 3184.383 ms plan: Query Text: select * from table1 order by column1; Sort (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1) Sort Key: column1 Sort Method: external merge Disk: 4696kB Buffers: shared hit=837, temp read=587 written=589 -> Seq Scan on table (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1) Buffers: shared hit=834
आप यहां देख सकते हैं कि आपको शुरुआत में क्वेरी अवधि मिलती है, जिसे आप आमतौर पर क्वेरी प्लान के अंत में देखने के आदी हो सकते हैं। आप किसी भी पैरामीटर सहित क्वेरी टेक्स्ट भी देखेंगे।
लोकप्रिय विज़ुअलाइज़ेशन टूल व्याख्या करते हैं। depesz और व्याख्या करते हैं। dalibo दोनों टेक्स्ट प्रारूप में क्वेरी योजनाओं को स्वीकार करते हैं, लेकिन वे दोनों JSON प्रारूप का भी समर्थन करते हैं। यदि आपकी कुछ टीम पीईवी और पीजी मस्टर्ड जैसे टूल का उपयोग करना पसंद करती है, जो केवल जेएसओएन प्रारूप का समर्थन करते हैं, तो आप इसे प्रारूप के रूप में सेट करना चाहेंगे। स्केलग्रिड पर ग्राहकों के लिए हमने JSON प्रारूप का विकल्प चुना, आंशिक रूप से क्योंकि हम इसे अपनी धीमी क्वेरी विश्लेषण सुविधा के लिए अधिक आसानी से पार्स करना चाहते थे।
यहां auto_explain पैरामीटर और उनके डिफ़ॉल्ट की पूरी सूची है:
पैरामीटर | <वें स्टाइल ="चौड़ाई:25%; पैडिंग:10 पीएक्स; बॉर्डर:1 पीएक्स सॉलिड #ईई; बैकग्राउंड:#273039; रंग:#fff;">पोस्टग्रेएसक्यूएल डिफॉल्ट्स <वें शैली ="चौड़ाई:25%; पैडिंग:10पीएक्स; सीमा:1 पीएक्स ठोस #ईई; पृष्ठभूमि:#273039; रंग:#fff;">स्केलग्रिड डिफ़ॉल्ट||
---|---|---|
auto_explain.log_min_duration | -1 | 100 |
auto_explain.log_analyze | ऑफ़ | चालू |
auto_explain.log_timeing | चालू (log_analyze के साथ) | चालू |
auto_explain.log_buffers | ऑफ़ | चालू |
auto_explain.log_verbose | ऑफ़ | चालू |
auto_explain.log_triggers | ऑफ़ | ऑफ़ |
auto_explain.log_nested_statements | ऑफ़ | ऑफ़ |
auto_explain.log_settings (v12) | ऑफ़ | ऑफ़ |
auto_explain.log_wal (v13) | ऑफ़ | ऑफ़ |
auto_explain.log_format | TEXT | JSON |
auto_explain.log_level | LOG | LOG |
auto_explain.sample_rate | 1 | 1 |
auto_explain इंस्टॉल करना
स्केलग्रिड पर, auto_explain डिफ़ॉल्ट रूप से 100ms की सीमा के साथ चालू होता है। आप इसे Admin -> Config के अंतर्गत कॉन्फ़िगर कर सकते हैं।
vanilla PostgreSQL पर, आप auto_explain को केवल session_preload_libraries
में से किसी एक में जोड़कर इंस्टॉल कर सकते हैं। या shared_preload_libraries
. पहले वाले के फायदे हैं a) पुनरारंभ की आवश्यकता नहीं है (लेकिन इसे केवल नए सत्रों में लोड किया जाएगा) और b) इसे केवल कुछ उपयोगकर्ताओं के लिए सक्षम करना संभव बनाता है (इस पैरामीटर को ALTER ROLE SET<के साथ सेट करके) /कोड> )।
इस तरह, auto_explain के लिए एक बुनियादी कॉन्फिग सेट-अप कुछ इस तरह दिख सकता है:
session_preload_libraries = auto_explain auto_explain.log_min_duration = 100 auto_explain.log_analyze = true auto_explain.log_buffers = true auto_explain.log_format = JSON
यदि आप किसी भिन्न होस्टिंग प्रदाता का उपयोग कर रहे हैं, तो यह जाँचने योग्य है कि वे auto_explain का समर्थन करते हैं या नहीं। उदाहरण के लिए, आरडीएस पोस्टग्रेज करता है, लेकिन स्केलग्रिड के विपरीत, यह डिफ़ॉल्ट रूप से बंद है, इसलिए इसे चलाने के लिए आपको कॉन्फ़िगरेशन को संपादित करने की आवश्यकता होगी।
auto_explain को एक सत्र में लोड किया जा रहा है
यदि आप ऑटो_एक्सप्लेन को सत्रों में स्वचालित रूप से नहीं चलाना चाहते हैं, तो एक सुपरयूज़र के रूप में आपके पास इसे एक सत्र में लोड करने का विकल्प भी है:
LOAD 'auto_explain';
यह एकबारगी डिबगिंग सत्रों के लिए अविश्वसनीय रूप से उपयोगी हो सकता है लेकिन स्वाभाविक रूप से अनावश्यक है यदि आप इसे पहले से चलाने में सक्षम हैं।
auto_explain सीमाएं और गठजोड़
हमने इनमें से कुछ का उल्लेख पहले ही कर दिया है, लेकिन यह खुद को auto_explain की कुछ कमियों और सीमाओं को याद दिलाने का एक समझदार समय लगता है।
सबसे पहले, विशेष रूप से प्रति-ऑपरेशन समय को ट्रैक करते समय, auto_explain का उपयोग करने के लिए मापने योग्य ओवरहेड हो सकता है। यह कम हो सकता है, यहां तक कि समय मापा जा सकता है, लेकिन हमेशा की तरह यह अपना परीक्षण करने लायक है।
दूसरा, auto_explain टाइमिंग क्वेरी प्लानिंग समय से अलग है। धीमे प्रश्नों के लिए योजना बनाने का समय अक्सर छोटा होता है, लेकिन असाधारण मामलों में, यह अधिकांश मुद्दों के लिए जिम्मेदार हो सकता है। इसलिए, ध्यान रखें कि हो सकता है कि ये मामले आपके लॉग में न दिखें, या यदि वे ऐसा करते हैं, तो आप जो कुछ भी देख रहे हैं, उसमें एक विसंगति योजना समय के साथ हो सकती है। एक मैनुअल व्याख्या विश्लेषण
जल्दी से आपको यह पता लगाने में मदद करेगा।
क्वेरी को गति देने के लिए व्याख्या आउटपुट का उपयोग कैसे करें
एक बार जब आपके पास अपने सबसे धीमे प्रश्नों के लिए व्याख्या आउटपुट हो, तो अब आप उन्हें तेज करना शुरू कर सकते हैं!
आपको लॉग से क्वेरी प्लान प्राप्त करने की आवश्यकता होगी, जिसके लिए आप pgBadger का उपयोग कर सकते हैं यदि आप एक प्रबंधित सेवा का उपयोग नहीं कर रहे हैं जो आपके लिए ऐसा करती है।पी>
EXPLAIN योजनाओं की समीक्षा करना अपने आप में एक बहुत बड़ा विषय है। PostgreSQL दस्तावेज़ में EXPLAIN का उपयोग करने के लिए एक अच्छा लेकिन संक्षिप्त परिचय शामिल है, और यद्यपि EXPLAIN ANALYZE पढ़ने पर थॉटबॉट का लेख एक अच्छा अगला कदम है। यदि आप एक घंटे की लंबी बातचीत पसंद करते हैं, तो जोश बर्कस द्वारा समझाया गया व्याख्या उत्कृष्ट था। अधिक जानकारी के लिए, Depesz के पास स्पष्टीकरण की एक श्रृंखला है जिसे समझाया नहीं जा सकता है और pgMustard टीम के पास काफी व्यापक EXPLAIN शब्दावली है।
यदि आपको अपने डेटाबेस को प्रबंधित करने और अपने धीमे प्रश्नों को गति देने के लिए PostgreSQL विशेषज्ञों की सहायता की आवश्यकता है, तो स्केलग्रिड को आज़माएं। हम मुफ़्त 24/7 एंटरप्राइज़-स्तरीय सहायता प्रदान करते हैं जो इन धीमी क्वेरी के माध्यम से आपका मार्गदर्शन कर सकती है और उन सभी को अनुकूलित करने में आपकी सहायता कर सकती है। हमारा 30-दिवसीय नि:शुल्क परीक्षण आपको PostgreSQL और हमारे अन्य समर्थित डेटाबेस के लिए हमारी कई सुविधाओं को आज़माने के लिए पर्याप्त समय देता है।
हमें उम्मीद है कि यह आपको auto_explain के साथ आरंभ करने के लिए आवश्यक सब कुछ प्रदान करेगा और आपके पास धीमी क्वेरी को तेज करना शुरू करेगा। अगर आप कुछ और जानना चाहते हैं, तो संपर्क करें।