首页 > 解决方案 > PostgreSQL 中的列填充节省空间

问题描述

根据本教程,我们可以看到相同整数大小的列对齐将节省空间。这是非常好的。但我还是很困惑。它是基于数据类型对齐还是数据类型大小?我相信基于数据类型大小,而不是数据类型。 

标签: postgresqldatabase-administration

解决方案


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。


推荐阅读