首页 > 解决方案 > Postgres 列数据类型在内存和性能方面的变化有多大?

问题描述

引用文档

整数类型是常见的选择,因为它在范围、存储大小和性能之间提供了最佳平衡。smallint 类型通常仅在磁盘空间非常宝贵的情况下使用。bigint 类型只有在整数类型的范围不足的情况下才应该使用,因为后者肯定更快。

我的理解是不同的数据类型需要不同的内存分配。所以我假设,更少的空间意味着获取数据所需的搜索更少(至少理论上是这样)。我不确定读取、写入和计算。

数据类型的变化在以下方面有多么重要:

  1. 贮存
  2. 写入表
  3. 从表中读取
  4. 执行计算(例如添加两列)

标签: postgresql

解决方案


a的大小smallint是2个字节,aninteger有4个字节,a有bigint8个。所以基本的空间需求是显而易见的。

但是,需要考虑对齐:ainteger必须从可被 4 整除的偏移量开始,并且 a 必须从bigint可被 8 整除的偏移量开始。因此,除非您仔细排列表列,否则您可能会丢失通过选择较小的数据类型来清空而获得的所有空间填充字节

对表的读取或写入 I/O 的影响与节省的空间成正比,因此通常是微不足道的。对于索引,影响可能更大,因为短索引键意味着高扇出、更少的内部页面和更低的索引树深度。

使用各种整数的计算由硬件执行,因此它们都非常快。差异应该是可衡量的,但不是极端的。

总而言之,选择较小的整数数据类型几乎是不值得的。如果(例如)您的主键序列用完integer值,您必须遭受的痛苦远远超过节省空间的任何好处。


推荐阅读