Lubię to, aby znaleźć brakujące indeksy:
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
AND n_live_tup > 10000
AND pg_relation_size(relname :: regclass) > 5000000
ORDER BY relname ASC;
Sprawdza, czy jest więcej skanowań sekwencji niż indeksów. Jeśli tabela jest mała, jest ignorowana, ponieważ Postgres wydaje się preferować skanowanie sekwencyjne.
Powyższe zapytanie ujawnia brakujące indeksy.
Następnym krokiem byłoby wykrycie brakujących indeksów połączonych. Myślę, że nie jest to łatwe, ale wykonalne. Może analiza wolnych zapytań ... Słyszałem, że pg_stat_statements może pomóc ...