首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行频繁插入时防止标识id列上溢出

在执行频繁插入时防止标识id列上溢出
EN

Stack Overflow用户
提问于 2021-06-02 15:40:58
回答 1查看 315关注 0票数 2

我有一个表,它有一个id列,并指定如下:

代码语言:javascript
复制
CREATE TABLE foo
(
    id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    name text,
    description text,
    CONSTRAINT foo_pkey PRIMARY KEY (id)
)

我经常更新这个表(每5分钟更新一次),但我使用的是“关于冲突,什么都不做”。

正如在本文中所描述的,serial in postgres is being increased even though I added on conflict do nothing预期id将使用此设置递增。

然而,基于这篇文章,What happens to the primary key Id when it goes over the limit?,我确实需要担心计数器超过限制。

如何防止此场景中发生错误?

要明确的是,我不需要这些值是空白的,也不一定需要有顺序的值,我只需要唯一性,我希望能够使用尽可能小的数据类型(我想在某个时候切换到smallint )。

我可以看到可能的解决办法:

  1. 手动确保在完成实际插入之前不会插入重复项,就像在本解决方案中所做的那样:POSTGRES - prevent serial incrementation with ON CONFLICT DO NOTHING缺点:计算中,现在每插入一次不检查唯一性约束两次吗?
  2. 在某种程度上让postgres使用间隙--没有顺序值。缺点:似乎并不是postgres应该如何工作的目的,
  3. 让postgres在计数器循环时重新启动计数器,而不是抛出错误:https://www.postgresql.org/docs/9.5/sql-createsequence.html说有一个循环选项,听起来就像我所需要的。
  4. 只是跟着它,接受我需要使用bigintH 221G 222

更新

迄今为止:

PostgreSQL gapless sequences

  • Not可行选项,但如前所述,基于本文的
  1. 可能存在一个cpu资源惩罚
  2. 坏主意,因为这将导致id的
  3. 最佳选择在大多数情况下是

就我的具体情况而言,我想进一步确定备选案文1是否比备选案文4更好:

带有id的

  • 表大约有20k行
  • 包含几乎所有20k重复项的批插入,每5分钟进行一次
  • ,引用该id的表包含10bn+行并在上运行,我们使用bigint(8字节)而不是int(4字节),我们使用的是(100亿*(8-4)字节)约40GB的未压缩额外空间
    • ,我猜这将被压缩到10 ca的额外空间,用于id的

    F 247

在这种情况下,考虑到对表进行的不频繁更新以及在本例中存储id的空间使用情况,选择选项4比选项1更好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-02 15:53:55

我认为正确的解决方案是另一个解决方案:将identity列的数据类型更改为bigint。然后你就不会用完序列值。

使用简单的ALTER TABLE执行该更改将重写它,并在语句的持续时间内锁定它。有更复杂的方法可以用较少的时间来完成,例如,请参见this answer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67808320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档