查找未使用的索引

Gon*_*uez 9 postgresql index index-tuning postgresql-9.4

我使用以下查询来查找未使用的索引:

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;
Run Code Online (Sandbox Code Playgroud)

在运行之前我应该​​运行任何统计收集语法或其他任何内容吗?上述查询可以用于此目的吗?我的意思是,那么 SQL 输出中显示的所有索引都应该被删除吗?

这是一个已有 8 年历史的 BD,因此结果行可能实际上是遗留下来的,我想应该有足够的统计数据,以便告诉在哪里使用 和 。

Joh*_*hir 11

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;
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很棒。您能否对某些条件添加一些评论?例如“indisunique”、“idx_scan=0”、“pg_relation_size(i.indexrelid) / nullif(idx_scan, 0)”? (2认同)

Pet*_*aut 6

似乎是一个不错的方法。当然,在自动删除所有看似未使用的内容之前,应该对此进行一些人工验证。例如,可以想象统计数据最近被重置和/或索引仅用于某些偶尔的批处理任务。

  • 您可以检查pg_stat_database.stats_reset。这不仅可以检测有意重置,还可以检测由于崩溃或不正常关闭而导致的重置。统计数据也可以在单个对象上重置,但我认为没有任何方法可以查看何时/是否发生了这种情况。 (4认同)
  • 为此:`select stats_reset from pg_stat_database;` (3认同)
  • 是否可以知道统计数据何时重置? (2认同)