Gibt es ein Tool oder eine Methode, um Postgres zu analysieren und zu bestimmen, welche fehlenden Indizes erstellt und welche nicht verwendeten Indizes entfernt werden sollen? Ich habe ein wenig Erfahrung mit dem "Profiler" -Tool für SQLServer, aber mir ist kein ähnliches Tool bekannt, das in Postgres enthalten ist.
sql
database-design
postgresql
Cerin
quelle
quelle
Antworten:
Ich mag es, fehlende Indizes zu finden:
Dies prüft, ob mehr Sequenzscans als Indexscans vorhanden sind. Wenn die Tabelle klein ist, wird sie ignoriert, da Postgres Sequenzscans für sie zu bevorzugen scheint.
Die obige Abfrage zeigt fehlende Indizes.
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 ...
quelle
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;
too_much_seq
positiv und groß ist, sollten Sie sich Sorgen machen.Überprüfen Sie die Statistiken.
pg_stat_user_tables
undpg_stat_user_indexes
sind diejenigen, mit denen zu beginnen.Siehe " Der Statistiksammler ".
quelle
Auf die Bestimmung fehlender Indizes Ansatz .... Nein. Es gibt jedoch einige Pläne, um dies in zukünftigen Versionen zu vereinfachen, z. B. Pseudoindizes und maschinenlesbare EXPLAIN.
Derzeit müssen Sie
EXPLAIN ANALYZE
Abfragen mit schlechter Leistung durchführen und dann manuell die beste Route ermitteln. Einige Protokollanalysatoren wie pgFouine können dabei helfen, die Abfragen zu ermitteln.Bei einem nicht verwendeten Index können Sie Folgendes verwenden, um sie zu identifizieren:
Dies hilft dabei, gelesene, gescannte und abgerufene Tupel zu identifizieren.
quelle
Ein weiteres neues und interessantes Tool zur Analyse von PostgreSQL ist PgHero . Es konzentriert sich mehr auf die Optimierung der Datenbank und macht zahlreiche Analysen und Vorschläge.
quelle
Sie können die folgende Abfrage verwenden, um die Indexverwendung und die Indexgröße zu ermitteln:
Die Referenz stammt aus diesem Blog.
quelle
Es gibt mehrere Links zu Skripten, mit denen Sie nicht verwendete Indizes im PostgreSQL-Wiki finden können . Die grundlegende Technik besteht darin,
pg_stat_user_indexes
diejenigen zu suchen und zu suchen, bei denenidx_scan
die Anzahl, wie oft dieser Index zur Beantwortung von Anfragen verwendet wurde, Null oder zumindest sehr niedrig ist. Wenn sich die Anwendung geändert hat und ein früher verwendeter Index wahrscheinlich nicht jetzt vorhanden ist, müssen Sie manchmal ausführenpg_stat_reset()
, um alle Statistiken auf 0 zurückzusetzen und dann neue Daten zu sammeln. 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 Abfragen mit einem Abfrageprotokoll-Analysetool wie pgFouine oder pqa lange dauern. Weitere Informationen finden Sie unter " Protokollieren schwieriger Abfragen ".
Der andere Ansatz besteht darin,
pg_stat_user_tables
Tabellen mit einer großen Anzahl von sequentiellen Scans zu betrachten und zu suchen, bei denen eine große Anzahl vorhandenseq_tup_fetch
ist. Wenn ein Index verwendetidx_fetch_tup
wird, wird stattdessen die Anzahl erhöht. Das kann Sie darauf hinweisen, wenn eine Tabelle nicht gut genug indiziert ist, um Fragen zu beantworten.Finden Sie heraus, auf welche Spalten Sie dann indizieren sollten? Das führt normalerweise wieder zur Analyse des Abfrageprotokolls zurück.
quelle
Sie können es mithilfe der folgenden Abfrage in der Postgres-Konsole finden
Weitere Informationen finden Sie unter https://www.postgresql.org/docs/current/monitoring-stats.html
quelle
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.quelle
quelle
Dies sollte helfen: Pratical Query Analysis
quelle