Postgresql 计算元组大小
我试图理解在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
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