Postgresql 计算元组大小

Postgresql 计算元组大小,postgresql,database-design,storage,Postgresql,Database Design,Storage,我试图理解在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 boolea

我试图理解在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)
元组大小:

元组头的23字节开销+空位图的1字节,因此:

24+4+4+8+8+5+7+5+5+8+1+1=80,但实际元组大小为82

是否有2字节的额外开销

我理解下面链接中给出的示例:

如果我们删除
列_8numeric(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中的列顺序有什么建议吗?

列9时间戳之前,您又遗漏了2个字节的填充,需要以8字节的倍数开始

24+4+4+8+8+5+7+5+5+8+1+1=80,但实际元组大小为82。

------------------^固定大小的类型应该先放置8字节,然后是4字节,然后是2字节,然后是1字节。变量大小类型如char(n)、varchar(n)、text、numeric(p,s)如何。我认为它是数字(p,s),char(n),varchar(n),然后是文本。我的理解正确吗?@user3756488:您可以混合不需要自由对齐的可变大小类型(选择有意义的顺序,而不考虑存储)。只有需要对齐的类型才能使对齐方式有所不同,可能需要填充。它也有助于性能(而不是存储)一点点有固定长度,而不是空列第一。感谢埃尔文布兰德施泰特。我想知道的数据类型,不需要填充?
24+4+4+8+8+5+7+5+5+8+1+1=80 but the actual tuple size is 82.  
------------------^ <----- 2 bytes of padding here