PostgreSQL सूचकांक उपयोग विश्लेषण


86

क्या पोस्टग्रेज का विश्लेषण करने के लिए एक उपकरण या विधि है, और यह निर्धारित करें कि क्या लापता सूचकांक बनाया जाना चाहिए, और कौन से अप्रयुक्त अनुक्रमित को हटा दिया जाना चाहिए? मुझे SQLServer के लिए "प्रोफाइलर" टूल के साथ ऐसा करने का थोड़ा अनुभव है, लेकिन मैं एक समान टूल के साथ शामिल नहीं हूं।


इसलिए यह। थोड़ी देर में इस पर ध्यान नहीं दिया। मेरे स्वीकृत उत्तर को अपडेट किया।
सेरिन

जवाबों:


164

मुझे यह पसंद है कि लापता अनुक्रमणिका मिलें:

SELECT
  relname                                               AS TableName,
  to_char(seq_scan, '999,999,999,999')                  AS TotalSeqScan,
  to_char(idx_scan, '999,999,999,999')                  AS TotalIndexScan,
  to_char(n_live_tup, '999,999,999,999')                AS TableRows,
  pg_size_pretty(pg_relation_size(relname :: regclass)) AS TableSize
FROM pg_stat_all_tables
WHERE schemaname = 'public'
      AND 50 * seq_scan > idx_scan -- more then 2%
      AND n_live_tup > 10000
      AND pg_relation_size(relname :: regclass) > 5000000
ORDER BY relname ASC;

यह जाँचता है कि यदि अधिक अनुक्रम स्कैन हैं तो सूचकांक स्कैन करता है। यदि तालिका छोटी है, तो इसे नजरअंदाज कर दिया जाता है, क्योंकि पोस्टग्रेज उनके लिए अनुक्रम स्कैन पसंद करते हैं।

उपरोक्त क्वेरी अनुपलब्ध अनुक्रमों को प्रकट करती है।

अगला कदम लापता संयुक्त सूचकांक का पता लगाना होगा। मुझे लगता है कि यह आसान नहीं है, लेकिन उल्लेखनीय है। शायद धीमी पूछताछ का विश्लेषण ... मैंने सुना है pg_stat_statements मदद कर सकता है ...


15
उद्धृत पहचानकर्ताओं के साथ इस कार्य को करने के लिए क्वेरी को इसमें परिवर्तित करें: SELECT relname, seq_scan-idx_scan AS too_much_seq, case when seq_scan-idx_scan>0 THEN 'Missing Index?' ELSE 'OK' END, pg_relation_size(relid::regclass) AS rel_size, seq_scan, idx_scan FROM pg_stat_all_tables WHERE schemaname='public' AND pg_relation_size(relid::regclass)>80000 ORDER BY too_much_seq DESC;
श्री मस्कट

10
इस प्रश्न के आउटपुट को उत्तर को और अधिक उपयोगी बनाने के लिए समझाया जाना चाहिए
cen

@Cen की बात के लिए, जब too_much_seqसकारात्मक और बड़ा आप चिंतित होना चाहिए।
mountainclimber11

1
@KishoreKumar मुझे लगता है कि पोस्टग्रेस के आँकड़े में अभी भी वे प्रश्न हैं जो आपके सूचकांक को अपडेट करने से पहले निष्पादित किए गए थे। आपके ट्रैफ़िक के आधार पर आँकड़े कुछ घंटों के बाद फिर से ठीक हो जाएंगे।
गुप्ताली

1
::regclassअपरकेस पहचानकर्ताओं, @Mr पर काम नहीं करेंगे। मस्कट का एक अच्छा समाधान है, इसके ('"' || relname || '"')::regclassबजाय इसका उपयोग करना भी संभव है ।
एड्रियन


10

लापता अनुक्रमणिका दृष्टिकोण को निर्धारित करने पर .... नहीं। लेकिन भविष्य में रिलीज को आसान बनाने के लिए कुछ योजनाएं हैं, जैसे कि छद्म सूचकांक और मशीन पठनीय विस्तार।

वर्तमान में, आपको EXPLAIN ANALYZEखराब प्रदर्शन वाले प्रश्नों की आवश्यकता होगी और फिर मैन्युअल रूप से सर्वोत्तम मार्ग निर्धारित करना होगा। कुछ लॉग विश्लेषक जैसे pgFouine प्रश्नों को निर्धारित करने में मदद कर सकते हैं।

जहां तक ​​अप्रयुक्त इंडेक्स की बात है, तो आप उनकी पहचान करने में मदद के लिए निम्नलिखित जैसे कुछ का उपयोग कर सकते हैं:

select * from pg_stat_all_indexes where schemaname <> 'pg_catalog';

यह ट्यूपल्स को पढ़ने, स्कैन करने, लाने में मदद करेगा।


फ्रैंक हेइकेन्स वर्तमान सूचकांक उपयोग पर क्वेरी करने के लिए कुछ अच्छी जगहों को भी बताता है।
रफुस्का

8

PostgreSQL का विश्लेषण करने के लिए एक और नया और दिलचस्प उपकरण PgHero है । यह डेटाबेस को ट्यून करने पर अधिक केंद्रित है और कई विश्लेषण और सुझाव देता है।

स्क्रीनशॉट


6

अनुक्रमणिका उपयोग और अनुक्रमणिका आकार खोजने के लिए आप नीचे क्वेरी का उपयोग कर सकते हैं:

इस ब्लॉग से संदर्भ लिया जाता है।

SELECT
    pt.tablename AS TableName
    ,t.indexname AS IndexName
    ,to_char(pc.reltuples, '999,999,999,999') AS TotalRows
    ,pg_size_pretty(pg_relation_size(quote_ident(pt.tablename)::text)) AS TableSize
    ,pg_size_pretty(pg_relation_size(quote_ident(t.indexrelname)::text)) AS IndexSize
    ,to_char(t.idx_scan, '999,999,999,999') AS TotalNumberOfScan
    ,to_char(t.idx_tup_read, '999,999,999,999') AS TotalTupleRead
    ,to_char(t.idx_tup_fetch, '999,999,999,999') AS TotalTupleFetched
FROM pg_tables AS pt
LEFT OUTER JOIN pg_class AS pc 
    ON pt.tablename=pc.relname
LEFT OUTER JOIN
( 
    SELECT 
        pc.relname AS TableName
        ,pc2.relname AS IndexName
        ,psai.idx_scan
        ,psai.idx_tup_read
        ,psai.idx_tup_fetch
        ,psai.indexrelname 
    FROM pg_index AS pi
    JOIN pg_class AS pc 
        ON pc.oid = pi.indrelid
    JOIN pg_class AS pc2 
        ON pc2.oid = pi.indexrelid
    JOIN pg_stat_all_indexes AS psai 
        ON pi.indexrelid = psai.indexrelid 
)AS T
    ON pt.tablename = T.TableName
WHERE pt.schemaname='public'
ORDER BY 1;

4

स्क्रिप्ट के लिए कई लिंक हैं जो आपको पोस्टग्रेक्यूएल विकी पर अप्रयुक्त अनुक्रमित खोजने में मदद करेंगे । बुनियादी तकनीक को देखना है pg_stat_user_indexesऔर उन लोगों को देखना है जहां idx_scan, प्रश्नों का उत्तर देने के लिए सूचकांक का उपयोग कितनी बार किया गया है, यह शून्य है, या कम से कम बहुत कम है। यदि एप्लिकेशन बदल गया है और पूर्व में उपयोग किया गया सूचकांक संभवत: अब नहीं है, तो आपको कभी-कभी pg_stat_reset()सभी आंकड़े 0 पर वापस लाने के लिए दौड़ना होगा और फिर अन्य डेटा एकत्र करना होगा; आप सब कुछ के लिए वर्तमान मूल्यों को बचा सकते हैं और यह पता लगाने के बजाय एक डेल्टा की गणना कर सकते हैं।

लापता इंडेक्स का सुझाव देने के लिए अभी तक कोई अच्छा उपकरण उपलब्ध नहीं है। एक तरीका यह है कि आपके द्वारा चलाए जा रहे प्रश्नों को लॉग करें और विश्लेषण करें कि किन लोगों को क्वेरी लॉग विश्लेषण टूल जैसे pgFouine या pqa का उपयोग करने में लंबा समय लग रहा है। अधिक जानकारी के लिए " लॉगिंग मुश्किल प्रश्न " देखें ।

अन्य दृष्टिकोण उन pg_stat_user_tablesतालिकाओं को देखने और देखने के लिए है जिनके पास बड़ी संख्या में अनुक्रमिक स्कैन हैं, जहां seq_tup_fetchबड़ी है। जब एक इंडेक्स का उपयोग किया जाता है तो idx_fetch_tupइसके बजाय गिनती बढ़ जाती है। जब कोई तालिका इसके विरुद्ध प्रश्नों का उत्तर देने के लिए पर्याप्त रूप से अनुक्रमित नहीं की जाती है, तो आप इसका सुराग लगा सकते हैं।

वास्तव में यह पता लगाना कि आपको किन कॉलमों पर अनुक्रमण करना चाहिए? यह आमतौर पर क्वेरी लॉग विश्लेषण सामग्री पर वापस जाता है।



1

PoWA PostgreSQL 9.4+ के लिए एक दिलचस्प उपकरण की तरह लगता है। यह आंकड़े एकत्र करता है, उन्हें कल्पना करता है, और अनुक्रमित करने का सुझाव देता है। यह pg_stat_statementsएक्सटेंशन का उपयोग करता है ।

PoWA PostgreSQL वर्कलोड एनालाइज़र है जो प्रदर्शन आँकड़े एकत्र करता है और आपके पोस्टग्रेक्यूएल सर्वर की निगरानी और धुन करने में मदद करने के लिए वास्तविक समय चार्ट और ग्राफ़ प्रदान करता है। यह Oracle AWR या SQL Server MDW के समान है।


0
CREATE EXTENSION pgstattuple; 
CREATE TABLE test(t INT); 
INSERT INTO test VALUES(generate_series(1, 100000)); 
SELECT * FROM pgstatindex('test_idx'); 

version            | 2 
tree_level         | 2 
index_size         | 105332736 
root_block_no      | 412 
internal_pages     | 40 
leaf_pages         | 12804 
empty_pages        | 0 
deleted_pages      | 13 
avg_leaf_density   | 9.84 
leaf_fragmentation | 21.42 

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.