postgresql – 在Postgres中生成非碎片UUID?

postgresql – 在Postgres中生成非碎片UUID?,第1张

概述如果我理解正确,完全随机的UUID值会创建碎片索引.或者,更准确地说,缺少公共前缀会阻止索引中的密集存储. 我已经看到了使用uuid_generate_v1()或uuid_generate_v1mc()而不是uuid_generate_v4()来避免这个问题的建议. 但是,似乎UUID规范的版本1首先具有ID的低位,从而阻止了共享前缀.此外,这个时间戳是60位,这似乎有点矫枉过正. 相比之下,一些 如果我理解正确,完全随机的UUID值会创建碎片索引.或者,更准确地说,缺少公共前缀会阻止索引中的密集存储.

我已经看到了使用uuID_generate_v1()或uuID_generate_v1mc()而不是uuID_generate_v4()来避免这个问题的建议.

但是,似乎UUID规范的版本1首先具有ID的低位,从而阻止了共享前缀.此外,这个时间戳是60位,这似乎有点矫枉过正.

相比之下,一些数据库为非标准UUID生成器提供前导32位然后12字节随机性的时间戳.参见Datomic的SquuID’s,例如1,2.

在Postgres中使用这样的“SquuIDs”实际上是否有意义?如果是这样,我如何使用pgplsql有效地生成这样的ID?

请注意,仅当您不删除值并且所有更新都生成 heap only tuples时,插入顺序索引条目将导致更密集的索引.

如果您想要顺序唯一索引值,为什么不自己构建它们?

您可以使用clock_timestamp()(以微秒为单位)作为bigint并附加循环序列中的值:

CREATE SEQUENCE seq MINVALUE 0 MAXVALUE 999 CYCLE;SELECT CAST(          floor(             EXTRACT(epoch FROM t)          ) AS bigint       ) % 1000000 * 1000000000     + CAST(          to_char(t,'US') AS bigint       ) * 1000     + nextval('seq')FROM (SELECT clock_timestamp()) clock(t);
总结

以上是内存溢出为你收集整理的postgresql – 在Postgres中生成非碎片UUID?全部内容,希望文章能够帮你解决postgresql – 在Postgres中生成非碎片UUID?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1181827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存