database - Postgres。我可以通过将 BIGINT 切换为 INT 来获得良好的加速吗

标签 database postgresql database-indexes

这个 Postgres 数据库拥有各种大小的表格,最多可达 1000 万行。几乎所有都有一个从 1 开始计数的 BIGINT 主键。

由于 BIGINT 是 64 位,但是 1000 万行完全在 INT 的 20 亿最大值之内,是否值得将这些 BIGINT 列转换为 INT(32 位)和 SMALLINT(16 位)以加速一些重型 SQL ?更紧凑地存储索引/表应该会给我们更高的缓存命中率。如果有的话,我可以期待多少加速?不使用 BIGINT 有什么缺点吗? (假设达到 INT/SMALLINT 的最大值永远不会成为问题)

最佳答案

这在很大程度上取决于实际的表和索引定义。该开关为该列节省了 4 个字节 - 但由于所有存储都是以 8 字节的倍数完成的,因此这可能会被对齐填充吞没,或者如果幸运的话可以释放 8 个字节。

支持 PK 的标准 btree 索引不会改变大小,对齐填充会丢失 4 个字节。 但是如果您在覆盖索引中使用了一个额外的 4 字节列,则节省了 8 个字节而不是 4 个字节,这使得索引元组总共有 20 个字节而不是 28 个字节。

bigint 主键只是开始。如果有外键引用,效果会成倍增加。或者您有涉及多个 FK 列的多列索引。然后开关可以很好地产生您正在寻找的良好加速。特别是在缓存内存有限的情况下。这一切都取决于。

如果您确定在表的整个生命周期内不会燃烧超过 3^31 个数字(不是 2^32:Postgres 使用有符号整数,您也必须使用负数),并且您实际上节省了表和索引中的空间,然后一定要切换到普通整数。我已经多次看到实际的差异。但是在你修改它之前,你需要对 Postgres 存储机制有一些了解。

相关:

关于database - Postgres。我可以通过将 BIGINT 切换为 INT 来获得良好的加速吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61081746/

相关文章:

sql-server - 内部消息的数据库设计(如 facebook 消息)

Sqlite 更新字段,如果它包含

sql - 在 PostgreSQL 中组合两个 SELECT 查询

ruby-on-rails - postgresql 中的“Where-in”查询显示相同结果的两个不同查询

mysql - 如何使用索引优化此 MySql 表的搜索速度?

asp.net - sql查询可以是什么?

c# - 从 C# 中的插入查询返回 ID

Postgresql varchar 到 int

postgresql - PostgreSQL 的 pg_stat_all_indexes 表中的统计信息存储多长时间?

搜索字段上的 SQL 索引,我应该包括 Id