Postgresql
查找未使用的索引
我正在使用以下查詢來查找未使用的索引:
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;