次のクエリを使用して、未使用のインデックスを見つけています。
SELECT
PSUI.indexrelid::regclass AS IndexName
,PSUI.relid::regclass AS TableName
FROM pg_stat_user_indexes AS PSUI
JOIN pg_index AS PI
ON PSUI.IndexRelid = PI.IndexRelid
WHERE PSUI.idx_scan = 0
AND PI.indisunique IS FALSE;
それを実行する前に、統計収集構文などを実行する必要がありますか?上記のクエリはそのような目的で問題ありませんか?つまり、SQL出力に表示されるすべてのインデックスを削除する必要がありますか?
それは8年前のBDなので、結果の行は実際に残っている可能性があります。十分な統計があるはずなので、どこで使用されているかを教えてください。
まともなアプローチのようです。もちろん、使用されていないように見えるすべてのものを自動的に削除する前に、これに人間による検証を適用する必要があります。たとえば、統計が最近リセットされたり、インデックスが一部の不定期のバッチタスクでのみ使用されたりすることが考えられます。
FWIWは私が使ってきたクエリです
SELECT
relname AS table,
indexrelname AS index,
pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
idx_scan as index_scans
FROM pg_stat_user_indexes ui
JOIN pg_index i ON ui.indexrelid = i.indexrelid
WHERE NOT indisunique AND idx_scan =0 AND pg_relation_size(relid) > 5 * 8192
ORDER BY pg_relation_size(i.indexrelid) / nullif(idx_scan, 0) DESC NULLS FIRST,
pg_relation_size(i.indexrelid) DESC;