postgresql - PostgreSQL 中的列填充节省空间
问题描述
根据本教程,我们可以看到相同整数大小的列对齐将节省空间。这是非常好的。但我还是很困惑。它是基于数据类型对齐还是数据类型大小?我相信基于数据类型大小,而不是数据类型。
解决方案
typlen
数据类型的长度(列pg_type
)决定了一个值将使用多少空间,但它与填充或由于对齐(列)而浪费的列之间的空间无关typalign
。
如果下一列的对齐比当前的对齐更大,那么您只会浪费空间,并且需要填充字节来填充其间的空间。
例如:
CREATE TABLE test (
x boolean NOT NULL,
y boolean NOT NULL,
z integer NOT NULL
);
每个都boolean
具有 1 个字节的对齐和长度,并且integer
具有 4 个字节的对齐。所以字节看起来像这样:
┌──────────────┐
│ x │
├──────────────┤
│ y │
├──────────────┤
│ padding byte │
├──────────────┤
│ padding byte │
├──────────────┤
│ z │
├──────────────┤
│ z │
├──────────────┤
│ z │
├──────────────┤
│ z │
└──────────────┘
第一列从最大对齐的偏移量开始(即地址可被 8 整除)。列z
必须从可被 4 整除的地址开始,因此需要两个填充 nytes。
推荐阅读
- reactjs - 当 React Hooks 中的 redux 状态更改时,道具不会更新
- apache-spark - 为什么在 Spark 中禁用和未记录自适应执行?
- ios - UIImage 获取 CVPixelBuffer 移除 Alpha
- javascript - 如何使用 intl-tel-input 的 utils.js 保存计数器代码?如何使用 javascript 提供的数据到 django 应用程序中?
- java - 在 Spring Boot JPA 中编辑对象值和使用 save() 时出现 MySQL java.sql.SQLSyntaxErrorException
- python - 使用 cv2 和 svm 的 setTermCriteria
- node.js - 可以看到视频流的开始,但没有别的。Node.js、MP4、HTML5。第一个 blob 中的文件签名
- c# - 是否可以让 MEF 多次实例化一个类?
- javascript - 如何更改 SweetAlert2 的关闭动画?
- python - 如何在 pygame 中制作具有透明色键的图像?