Postgresql

查找未使用的索引

  • November 21, 2019

我正在使用以下查詢來查找未使用的索引:

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;

引用自:https://dba.stackexchange.com/questions/137255