postgresql - Postgres 列数据类型在内存和性能方面的变化有多大?
问题描述
引用文档:
整数类型是常见的选择,因为它在范围、存储大小和性能之间提供了最佳平衡。smallint 类型通常仅在磁盘空间非常宝贵的情况下使用。bigint 类型只有在整数类型的范围不足的情况下才应该使用,因为后者肯定更快。
我的理解是不同的数据类型需要不同的内存分配。所以我假设,更少的空间意味着获取数据所需的搜索更少(至少理论上是这样)。我不确定读取、写入和计算。
数据类型的变化在以下方面有多么重要:
- 贮存
- 写入表
- 从表中读取
- 执行计算(例如添加两列)
解决方案
a的大小smallint
是2个字节,aninteger
有4个字节,a有bigint
8个。所以基本的空间需求是显而易见的。
但是,需要考虑对齐:ainteger
必须从可被 4 整除的偏移量开始,并且 a 必须从bigint
可被 8 整除的偏移量开始。因此,除非您仔细排列表列,否则您可能会丢失通过选择较小的数据类型来清空而获得的所有空间填充字节。
对表的读取或写入 I/O 的影响与节省的空间成正比,因此通常是微不足道的。对于索引,影响可能更大,因为短索引键意味着高扇出、更少的内部页面和更低的索引树深度。
使用各种整数的计算由硬件执行,因此它们都非常快。差异应该是可衡量的,但不是极端的。
总而言之,选择较小的整数数据类型几乎是不值得的。如果(例如)您的主键序列用完integer
值,您必须遭受的痛苦远远超过节省空间的任何好处。
推荐阅读
- matlab - 修复 MATLAB 标题图中的额外空间
- python - 移动平均时间序列分钟 Pandas
- php - 在 laravel phpunit 上检测到恶意软件
- c# - 如何处理带有问号“?”的旧 aspx url 在不使用 IIS 的新 mvc 网站中
- reactjs - 如何使用 react-bootstrap 模式
- cypress - 从 cypress 测试运行程序运行时目录路径不正确
- python-3.x - 烧瓶返回无,request.form 可能存在问题
- r - 跨时间的交互式多面情节?
- c# - 您可以通过 C# 中的外部变量获取结构中的值吗?
- node.js - 如果渲染()中的其他条件,则反应本机