我想了解列的顺序如何最小化PostgreSQL中的表大小。计算元组的大小
实施例:
CREATE TABLE test (
column_1 int
,column_2 int
,column_3 bigint
,column_4 bigint
,column_5 text
,column_6 text
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_9 timestamp
,column_10 boolean
,column_11 boolean
);
INSERT INTO test
VALUES(1,1,1,1,'test','test_1',12,12,current_timestamp,true,false);
SELECT pg_column_size(test.*) FROM test;
pg_column_size
----------------
82
(1 row)
元组大小:元组报头为NULL位图+ 1个字节的
23字节的开销,所以:
24 + 4 + 4 + 8 + 8 + 5 + 7 + 5 + 5 + 8 + 1 + 1 = 80,但实际的元组大小是82
是否有2字节的任何额外开销?
我明白以下链接给出的例子:
Calculating and saving space in PostgreSQL
如果我们去掉column_8 numeric(5,2)
随后还元组大小保持不变,即:82
我有重新排序表,以尽量减少元组大小,并给出80.
CREATE TABLE test (
column_3 bigint
,column_4 bigint
,column_9 timestamp
,column_1 int
,column_2 int
,column_10 boolean
,column_11 boolean
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_5 text
,column_6 text);
INSERT INTO test
VALUES(1,1,current_timestamp,1,1,true,false,12,12,'test','test_1');
SELECT pg_column_size(test) FROM test;
pg_column_size
----------------
80
PostgreSQL中的列顺序是否有任何建议?
的固定大小的类型应放置如8-字节首然后加入4-字节然后是2个字节,然后是1个字节。什么样的变量大小类型如char(n),varchar(n),文本,数字(p,s)。我认为它的数字(p,s),char(n),varchar(n)然后是文本。我的理解是否正确? – user3756488
@ user3756488:您可以混合不需要自由对齐的可变大小类型(选择有意义的顺序而不考虑存储)。只有需要对齐的类型才会产生差异,对齐可能需要填充。它还有助于性能(而不是存储)一点点地具有固定长度的非空列。 –
谢谢Erwin Brandstetter。 – user3756488