idx_scan统计信息是否自动重置(默认)?

时间:2019-05-06 16:18:30

标签: postgresql indexing statistics

我正在查看表(pg_stat_user_indexespg_stat_user_tables),发现许多未使用的索引。

但是在考虑进行任何操作以删除这些索引之前,我需要了解对这些数据(idx_scan进行的分析是从什么时期开始的,自数据库创建以来是什么时候?

pg_stat_database表(列stats_reset中),该日期通常是今天或不超过15天,但是此过程是否会干扰我上面提到的表?

没有执行命令pg_stat_reset()

pg_stat_reset()命令是否清除表(pg_stat_user_indexespg_stat_user_tables)?

我的目标是了解收集数据的时间,以便做出决定。

2 个答案:

答案 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;
相关问题