log_cnt 在 postgres 序列中是什么意思?
What does log_cnt mean in the postgres sequence?
我试图找出为什么我的 table 中的序列号呈指数跳跃,而这可能是我的 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记录。
我试图找出为什么我的 table 中的序列号呈指数跳跃,而这可能是我的 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记录。