Мені подобається це, щоб знайти відсутні індекси:
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;
Це перевіряє, чи є більше послідовних сканувань, ніж сканування індексу. Якщо таблиця мала, вона ігнорується, оскільки, здається, Postgres надає перевагу скануванню послідовностей для них.
Над запитом виявляються відсутні індекси.
Наступним кроком буде виявлення відсутніх комбінованих індексів. Я думаю, це непросто, але здійсненно. Можливо, аналізуючи повільні запити ... Я чув, що pg_stat_statements може допомогти ...