Вычислить размер кортежа

Я пытаюсь понять, как порядок столбцов уменьшить размер таблицы в 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 байта?

я понял пример, приведенный по ссылке ниже:
расчет и экономия пространства в В 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?

1 ответов


вы пропустили еще 2 байта заполнения перед column_9 timestamp, который должен начинаться с кратного 8 байтов.

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

Это также причина для этого:

если убрать column_8 numeric(5,2) затем также размер кортежа остается прежним, т. е.: 82.

после вынимания этого столбца, который занимает 5 байт, вы получаете 7 байт заполнения в том же месте - в худшем случае.

также обратите внимание, что эта строка фактически занимает 88 байт на диске, потому что заголовок кортежа следующего кортежа выровнен слева (начинается с кратного MAXALIGN, обычно 8 байт).

ваша измененная строка заканчивается несколькими 8 байтами, не требует дополнительного заполнения и требует только 80 байтов.

обоим нужны еще 4 байта для указателя кортежа в заголовке страницы.

это игра "колонка тетрис", основы которой Вы, кажется, уже поняли. Как правило, вы не получите много, не думай об этом. Однако есть крайние случаи. Значения Null изменяют игру в строке.

вам нужно знать требования к размеру, выравниванию и заполнению для каждого типа данных и специальные правила для нулевого растрового изображения.

связанный ответ с подробным расчетом на дБА.SE: