postgresql - postgres 序列中的 log_cnt 是什么意思?

标签 postgresql sequence

我试图弄清楚为什么我的表中的序列号呈指数级增长,而这可能是我的 API 中的一个问题,我仍然需要弄清楚,我遇到了这个查询
找到序列的当前值SELECT * from some_sequence它给了我一个名为 log_cnt 的列.该列的值一直在 30 左右跳跃。我不确定这个数字是什么意思,以及这是否会影响序列中的下一个数字。
有人可以帮我吗?

最佳答案

必须将序列状态的更改写入事务日志 (WAL)。
这可能会导致大量 WAL 记录,从而损害性能。
作为一种优化,PostgreSQL 不会记录当前的序列计数器,而是记录一个大 32 的值。在 src/backend/commands/sequence.c 中查看此评论:

/*
 * We don't want to log each fetching of a value from a sequence,
 * so we pre-log a few fetches in advance. In the event of
 * crash we can lose (skip over) as many values as we pre-logged.
 */
#define SEQ_LOG_VALS    32
这意味着在崩溃期间最多可能丢失 32 个序列值(恢复会将序列设置为记录的位置),这没有问题。log_cnt显示在必须写入新的 WAL 记录之前剩余的提取次数。
在第一次调用 nextval 之后在一个检查点之后,log_cnt将是 32。每次调用 nextval 都会减少。 ,一旦达到0,再次设置为32,写入一条WAL记录。

关于postgresql - postgres 序列中的 log_cnt 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66456952/

相关文章:

java - Clojure 和 HBase : Iterate Lazily over a Scan

ios - Swift中如何保持Dictionary中数据的顺序?

python - 在 Python 中检索单个字典元素

oracle - NOORDER 如何在 Oracle 数据库上工作?

postgresql - 我刚调用 nextval 时,pgsql 序列如何未定义?

sql - 如何创建 SELECT 查询 FROM "TABLE1 AND TABLE2"

ruby-on-rails - 使用 Postgres 在 ActiveRecord 查询中别名计算结果、分组和求和

postgresql - 我如何为数据每隔几个月明显不同的表配置分析阈值?

json - PostgreSQL 表到 json

postgresql - 有什么方法可以*不*在 Postgresql 中使用服务器端准备好的语句?