基于本教程,我们可以看到相同整数大小的列对齐将节省空间。太好了。但我还是很困惑。它是基于数据类型对齐还是数据类型大小?我相信这是基于数据类型大小,而不是数据类型。
数据类型的长度(pg_type
中的列typlen
(决定了值将使用多少空间,但它与列之间的填充或由于对齐而浪费的空间无关(列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 │
└──────────────┘
第一列从最大对齐的偏移量开始(也就是说,地址可以被八整除(。列z
必须从可被4整除的地址开始,因此需要两个填充nyte。