我应该在新应用程序中使用 Postgres 的 bigserial 记录吗?

Posted

技术标签:

【中文标题】我应该在新应用程序中使用 Postgres 的 bigserial 记录吗?【英文标题】:Should I use Postgres' bigserial for records in a new application? 【发布时间】:2014-10-21 07:43:19 【问题描述】:

我正在开发一个将数据存储在 PostgreSQL 数据库中的新应用程序。除其他内容外,此类数据是来自某些测量设备的仪表记录。每个客户可能有成百上千的这些设备,而且通常每天都提供很少的记录。较新的记录通过简单地删除较旧的记录来替换较旧的记录,并作为具有新 ID 的新记录插入。我的公司不知道我们每天真正需要存储多少客户和多少测量设备和记录。

由于这是一个新应用程序,我想就使用serialbigserial 作为计量记录的ID 征求您的意见。当前的 x64 CPU 等是否有明显的性能下降? ID 字段的存储应该增加 2 倍,对吧?为什么不使用bigserial 有什么明显的理由吗?

谢谢!

【问题讨论】:

【参考方案1】:

bigserial 数据类型作为表的序列和主键没有明显的性能问题。详情请阅读documentation 和older question about subject。

顺便说一句:如果你有 10000 台设备并且每个设备每天产生 10 条记录,整数就足够 60 年,所以我认为整数就足够了 ;-)

【讨论】:

为什么不只使用 64 位整数并确保年龄安全? :) 你付出的唯一代价就是一些内存,反正很便宜。 @uraf 你是对的,内存很便宜,但目前的 ssd 磁盘不是 ;-) 这不仅仅是每天那 10 条记录,我特别想到了由于错误期间回滚事务等造成的差距。当然,这些根本不应该经常发生……这只是一种直觉。 :-)【参考方案2】:

就性能而言,没有区别 - 假设 PostgreSQL 已正确编译以利用 x86_64 平台。例如,添加两个 32 位整数与添加 64 位整数所用的时间相同。但是,如果它是为普通 x86(32 位)编译的,性能将会有一些(边际?)下降,因为它需要以某种方式仅使用 32 位寄存器来模拟 64 位算术。

简而言之:确保您使用 64 位版本的 PostgreSQL,您应该一切顺利!

【讨论】:

在 CREATE SEQUENCE 的文档中我之前没有认识到的另一个有趣的声明:“序列基于 bigint 算术[...]在一些较旧的平台上[...]序列使用常规整数算术 [...]" 所以 32 位整数似乎真的是某种遗产。

以上是关于我应该在新应用程序中使用 Postgres 的 bigserial 记录吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?

固定大小字符串的 Postgres 数据类型

什么时候应该在新标签/窗口中打开链接?

使用servlet在新窗口中打开pdf文件

我应该如何在活动之间进行沟通? [复制]

我应该在新视图中嵌入视图控制器的视图吗?