it-swarm.com.de

PostgreSQL-Index-Verwendungsanalyse

Gibt es ein Tool oder eine Methode, um Postgres zu analysieren und festzustellen, welche fehlenden Indizes erstellt und welche nicht verwendeten Indizes entfernt werden sollten? Ich habe ein wenig Erfahrung damit mit dem "Profiler" -Tool für SQL Server, aber mir ist kein ähnliches Tool bekannt, das in Postgres enthalten ist.

77
Cerin

Ich finde es gut, wenn Indizes fehlen:

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;

Dadurch wird überprüft, ob es mehr Sequenz-Scans als Index-Scans gibt. Wenn die Tabelle klein ist, wird sie ignoriert, da Postgres Sequenz-Scans für sie zu bevorzugen scheint.

Die obige Abfrage zeigt fehlende Indizes an.

Der nächste Schritt wäre das Erkennen fehlender kombinierter Indizes. Ich denke, das ist nicht einfach, aber machbar. Vielleicht die langsamen Abfragen analysieren ... Ich habe gehört pg_stat_statements könnte helfen ...

149
guettli

Überprüfen Sie die Statistiken. pg_stat_user_tables und pg_stat_user_indexes sind die, mit denen man beginnen soll.

Siehe " The Statistics Collector ".

19
Frank Heikens

Auf die Ermittlung fehlender Indizes zugehen .... Nö. Es gibt jedoch Pläne, dies in zukünftigen Versionen zu vereinfachen, wie Pseudo-Indizes und maschinenlesbares EXPLAIN.

Derzeit müssen Sie EXPLAIN ANALYZE Abfragen mit schlechter Leistung und manuelle Ermittlung der besten Route. Einige Protokollanalysatoren wie pgFouine können helfen, die Abfragen zu ermitteln.

In Bezug auf einen nicht verwendeten Index können Sie Folgendes verwenden, um diese zu identifizieren:

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

Dies hilft beim Identifizieren der gelesenen, gescannten und abgerufenen Tupel.

8
rfusca

Ein weiteres neues und interessantes Tool zur Analyse von PostgreSQL ist PgHero . Es konzentriert sich mehr auf die Optimierung der Datenbank und enthält zahlreiche Analysen und Vorschläge.

screenshot

6
n1000

Es gibt mehrere Links zu Skripten, die Ihnen helfen, nicht verwendete Indizes im PostgreSQL-Wiki zu finden. Die grundlegende Technik besteht darin, pg_stat_user_indexes Zu betrachten und nach solchen zu suchen, bei denen idx_scan, Die Anzahl, wie oft dieser Index zur Beantwortung von Abfragen verwendet wurde, null oder zumindest sehr niedrig ist. Wenn sich die Anwendung geändert hat und ein früher verwendeter Index wahrscheinlich nicht mehr vorhanden ist, müssen Sie manchmal pg_stat_reset() ausführen, um alle Statistiken auf 0 zurückzusetzen und dann neue Daten zu erfassen. Sie können die aktuellen Werte für alles speichern und stattdessen ein Delta berechnen, um dies herauszufinden.

Es sind noch keine guten Tools verfügbar, um fehlende Indizes vorzuschlagen. Ein Ansatz besteht darin, die von Ihnen ausgeführten Abfragen zu protokollieren und zu analysieren, welche mit einem Abfrageprotokoll-Analysetool wie pgFouine oder pqa sehr lange ausgeführt werden. Weitere Informationen finden Sie unter " Protokollieren schwieriger Abfragen ".

Der andere Ansatz besteht darin, pg_stat_user_tables Zu betrachten und nach Tabellen zu suchen, die eine große Anzahl aufeinanderfolgender Scans enthalten, wobei seq_tup_fetch Groß ist. Wenn ein Index verwendet wird, wird stattdessen die Anzahl idx_fetch_tup Erhöht. Dies kann Aufschluss darüber geben, ob eine Tabelle nicht gut genug indiziert ist, um Abfragen zu beantworten.

Finden Sie heraus, für welche Spalten Sie dann einen Index erstellen sollten? Das führt in der Regel wieder zur Analyse des Abfrageprotokolls.

3
Greg Smith

Sie können die folgende Abfrage verwenden, um die Indexnutzung und die Indexgröße zu ermitteln:

Die Referenz stammt aus diesem Blog.

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;
3
Anvesh

PoWA scheint ein interessantes Tool für PostgreSQL 9.4+ zu sein. Es sammelt Statistiken, visualisiert sie und schlägt Indizes vor. Es verwendet die pg_stat_statements Erweiterung.

PoWA ist PostgreSQL Workload Analyzer, der Leistungsstatistiken sammelt und Echtzeitdiagramme und -grafiken zur Überwachung und Optimierung Ihrer PostgreSQL-Server bereitstellt. Es ähnelt Oracle AWR oder SQL Server MDW.

1
n1000
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 
0
madjardi