sev*_*sev 4 postgresql sequence database-internals
在 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)
更新解决一些问题
我相信这个解决方案可以提供更少的稀疏序列,这将允许用户使用更小的 id 类型(int 与 bigint),同时向后兼容当前的实现。
问题是无法确定该序列的使用方式和位置。它不一定是DEFAULT拥有序列的列的子句:nextval可以在任何地方调用并以创造性的方式使用,甚至在数据库之外。
即使您只考虑标识列的情况,扫描表中的“缺失值”也会非常昂贵,并且不清楚它应如何与 MVCC 交互。
最后,我看到的大多数对无间隙序列的请求都要求单调递增的值,而该解决方案无法提供。
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |