运行 pg_stat_reset 会导致性能问题吗?

maw*_*dne 3 postgresql

我正在对我们的数据库进行一些索引分析,看看是否有可以删除的索引。为此,我想运行select pg_stat_reset();将所有统计计数器重置为零,然后等待一周,看看哪些索引尚未使用。

运行pg_stat_reset()是否也会重置行计数统计信息?这会影响查询规划器吗?

Analyze public.#table#重置统计数据后是否建议在所有表上重新运行?

谢谢!

小智 8

pg_stat_reset 不会影响查询计划(它重置监控,而不是数据分布、统计信息),但它导致 autovacuum 认为最近没有清理过任何表,因此 autovacuum 活动将升高一段时间。这是否是一个问题取决于您的数据的具体情况及其使用方式。

这是Tomas Vondra 撰写的一篇好文章,解释了规划器使用的统计数据与 pg_stat_reset() 影响的统计数据之间的差异,以及 pg_stat_reset 如何与 autovacuum 交互。

不过,我想建议一种替代方案:只需运行CREATE TABLE statistics_snapshot_TODAYS_YYYYMMDD AS SELECT * FROM pg_stat_user_indexespg_stat_user_indexes如果您使用不同的pg_stat_*视图,请替换为您正在使用的任何内容),然后在一周内将其与视图结合起来并进行减法。这将为您提供每周的增量,而无需重置任何内容。

报告查询的草图(未经测试,但希望您明白):

SELECT
    stats_now.schemaname, stats_now.indexrelname,
    stats_now.idx_scan - stats_weekago.idx_scan idx_scan_delta,
    stats_now.idx_tup_read - stats_weekago.idx_tup_read idx_tup_read_delta,
    stats_now.idx_tup_fetch - stats_weekago.idx_tup_fetch idx_tup_fetch_delta
FROM pg_stat_user_indexes stats_now
JOIN statistics_snapshot_20201006 stats_weekago ON
    stats_now.indexrelid=stats_weekago.indexrelid;
Run Code Online (Sandbox Code Playgroud)