Які індекси є:
-- у psql
\d orders
-- або запитом
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'orders';
Чи використовуються - статистика pg_stat_user_indexes, яку PostgreSQL збирає з моменту останнього скидання статистики:
SELECT relname AS table,
indexrelname AS index,
idx_scan AS scans,
pg_size_pretty(pg_relation_size(indexrelid)) AS size
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC, pg_relation_size(indexrelid) DESC;
idx_scan = 0 означає, що індекс жодного разу не використали для пошуку. Такий індекс лише сповільнює запис і займає місце.
Перш ніж видаляти «невикористаний» індекс:
- Перевірити термін статистики: якщо її скинули вчора, щомісячний звіт ще не встиг скористатися індексом.
- Перевірити всі репліки: статистика збирається окремо на кожному сервері. Індекс може не використовуватися на primary, але бути критичним для звітів, що йдуть на репліку.
- Унікальні індекси й первинні ключі не видаляють, навіть з
idx_scan = 0: вони забезпечують цілісність, а не швидкість. - Видаляти через
DROP INDEX CONCURRENTLY, щоб не блокувати таблицю.
Окремо корисно: seq_scan і seq_tup_read у pg_stat_user_tables показують таблиці, які часто читаються повністю, - кандидати на новий індекс.