我正在对我们的数据库进行一些索引分析,看看是否有可以删除的索引。为此,我想运行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_indexes
(pg_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)