Ich mag es, fehlende Indizes zu finden:
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;
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 ...