小编sev*_*sev的帖子

关于 postgres 中几乎无间隙序列的建议

在 PostgreSQL 中,由于本文/sf/ask/698893751/中提到的原因,序列被设计为有间隙。我的问题是:是否可以通过定期(假设每天一次)检查哪些序列号未使用并将其添加回序列中以供使用,从而使序列几乎无间隙?

我假设当前 postgres 实现了一个序列作为计数器,每次访问它时它都会递增。相反,它可以通过自由值列表和计数器来实现。该序列将按如下方式工作:

# python style pseudo code

class Sequence:
    def __init__(self):
        self.free_numbers_set = []
        self.counter = 0

    def get_next_sequence_value(self):
        if not isempty(self.free_numbers_set):
            id = self.free_numbers_set.pop(0)
        else:
            id = self.counter
            id ++

        return id

    def add_free_numbers(self, column):
        for i in range(0:self.counter):
            if not i in column:
                free_numbers_set.append(i)
        free_numbers_set.sort()
Run Code Online (Sandbox Code Playgroud)

每当我们需要一个新的 id 时,get_next_sequence_value()我们就会定期运行add_free_numbers(column)

更新解决一些问题

  1. 对于标识列,获取当前使用的值将是微不足道的。在其他情况下,由用户提供已在使用的值的列表。
  2. 需要考虑与 MVCC 的交互。人们可以潜在地实现它,以便在缺失值更新期间,序列将默认为仅递增计数器 - 这将避免冲突。

我相信这个解决方案可以提供更少的稀疏序列,这将允许用户使用更小的 id 类型(int 与 bigint),同时向后兼容当前的实现。

postgresql sequence database-internals

4
推荐指数
1
解决办法
619
查看次数

标签 统计

database-internals ×1

postgresql ×1

sequence ×1