我从 2006 年开始使用 PostgreSQL。尽管如此,我还是会定期学习 PostgreSQL 的新知识。有时感觉我知道的越多,我就越觉得我还有很多东西要学。培训课程中初学者的问题常常让我学到新东西!今天,我的同事Pavlo告诉我有关 PostgreSQL 参数的信息stats_fetch_consistency。这可能不是您想要每天调整的参数,但您永远不知道。
使用默认的 stats_fetch_consistency 来获取过时的统计数据
假设您正在尝试调查检查点统计信息,您可以在pg_stat_checkpointerPostgreSQL v17 之后的视图中找到它:
-- start a transaction BEGIN; SELECT num_timed, num_requested FROM pg_stat_checkpointer; num_timed │ num_requested ═══════════╪═══════════════ 52 │ 4 (1 row) -- explicitly trigger a checkpoint CHECKPOINT; SELECT num_timed, num_requested FROM pg_stat_checkpointer; num_timed │ num_requested ═══════════╪═══════════════ 52 │ 4 (1 row)
复制
看起来统计信息仅在新事务中更新。这有点令人惊讶,因为我没有使用REPEATABLE READ隔离级别。直到今天,我才知道我可以用 来改变这种行为stats_fetch_consistency!
可能的设置stats_fetch_consistency
该参数stats_fetch_consistency控制 PostgreSQL 如何缓存以下统计视图的数据:
- pg_stat_archiver(WAL归档器统计信息)
- pg_stat_bgwriter(背景作者统计)
- pg_stat_checkpointer(检查点统计)
- pg_stat_io(每个后端类型的 I/O 统计信息)
- pg_stat_slru(有关SLRU缓存的统计信息)
- pg_stat_wal(WAL统计)
可能的值包括:
- none:PostgreSQL 根本不缓存统计数据,但每当您访问上述统计视图之一时都会读取它们
- cache:当你在数据库事务中第一次访问某个对象(表等)的统计信息时,PostgreSQL 会读取该对象的数据,然后在事务持续期间进行缓存
- snapshot:当你在数据库事务中第一次访问某个对象的统计信息时,PostgreSQL 会读取数据库中所有对象的数据,并在事务持续期间将其保存在缓存中
默认值为cache。因此,为了避免上一节中的意外情况,我只需将其设置stats_fetch_consistency为“ none”!
历史stats_fetch_consistency
PostgreSQL v15在提交 5891c7a8edstats_fetch_consistency中引入,作为跟踪共享内存中数据库统计信息的努力的一部分。因此,如果您和我一样,以前从未听说过此参数,那么您至少可以找个借口说这是一个相当新的参数。
用例stats_fetch_consistency
我认为默认值cache很少是您想要的。对于临时查询,您可能希望设置“ none”以避免出现上述意外情况。如果您有一个监控系统,该系统定期在单个事务中查询各种数据库统计信息,则“ snapshot”可能有助于获得一致的值。否则,我也会none对我的监控系统使用“ ”,希望它不会多次查询同一对象的统计信息。
结论
stats_fetch_consistency是 PostgreSQL 中不太重要的参数之一。我认为它并不重要,但none在大多数情况下,设置为“ ”可能就足够了。
原文地址:https://www.cybertec-postgresql.com/en/stats-fetch-consistency-in-postgresql/
原文作者:Laurenz Albe