我正在查看表(pg_stat_user_indexes
和pg_stat_user_tables
),发现许多未使用的索引。
但是在考虑进行任何操作以删除这些索引之前,我需要了解对这些数据(idx_scan
进行的分析是从什么时期开始的,自数据库创建以来是什么时候?
在pg_stat_database
表(列stats_reset
中),该日期通常是今天或不超过15天,但是此过程是否会干扰我上面提到的表?
没有执行命令pg_stat_reset()
。
pg_stat_reset()
命令是否清除表(pg_stat_user_indexes
和pg_stat_user_tables
)?
我的目标是了解收集数据的时间,以便做出决定。
答案 0 :(得分:1)
统计信息是累积性的,从创建集群起一直保留。
因此,如果您看到pg_stat_database.stats_reset
有规律的变化,则肯定有人通过pg_stat_reset()
函数明确地进行了更改。
这样做有点麻烦,因为这会重置所有统计信息,包括pg_stat_user_tables
中的统计信息,这些统计信息决定何时进行自动真空和自动分析。因此,在重置后,在自动分析收集到新的统计数据之前,这些操作将有些困难。
更好的方法是拍摄常规快照并计算差异。
您是对的,您应该在确定是否可以建立索引之前应收集更长的数据。例如,某些活动可能每月只发生一次,但是需要某些索引。
在删除索引之前,请考虑一下索引除了被扫描之外还具有其他用途:
它们可以是UNIQUE
或带有约束,在这种情况下,即使从未扫描过它们也可以达到目的。
表达式索引使PostgreSQL收集有关索引表达式分布的统计信息,这可能对查询计划和执行计划的质量产生显着影响。
您可以使用this blog中的查询来查找所有毫无用处的索引。
答案 1 :(得分:0)
仅超级用户被允许重置统计信息。查询计划程序取决于统计信息。
使用快照:
CREATE TABLE stat_idx_snap_m10_d29_16_12 AS SELECT * FROM pg_stat_user_indexes;
CREATE TABLE stat_idx_snap_m10_d29_16_20 AS SELECT * FROM pg_stat_user_indexes;
以后随时分析差异:
SELECT
s2.relid, s2.indexrelid, s2.schemaname, s2.relname, s2.indexrelname,
s2.idx_scan - s1.idx_scan as idx_scan,
s2.idx_tup_read - s1.idx_tup_read as idx_tup_read,
s2.idx_tup_fetch - s1.idx_tup_fetch as idx_tup_fetch
FROM stat_idx_snap_m10_d29_16_20 s2
FULL OUTER JOIN stat_idx_snap_m10_d29_16_12 s1
ON s2.relid = s1.relid AND s2.indexrelid = s1.indexrelid
ORDER BY s2.idx_scan - s1.idx_scan ASC;