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