log_cnt 在 postgres 序列中是什么意思?

时间:2021-03-03 12:20:04

标签: postgresql sequence

我试图弄清楚为什么我的表中的序列号呈指数级增长,而这可能是我的 API 中的一个问题,我仍然需要弄清楚,我遇到了这个查询 找到序列的当前值 SELECT * from some_sequence

它给了我一个名为 log_cnt 的列。此列的值一直在 30 左右跳跃。我不确定这个数字意味着什么,以及这是否会影响序列中的下一个数字。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:7)

必须将序列状态的更改写入事务日志 (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 记录。