Строковые типы данных всегда типы данных переменной ширины в PostgreSQL, независимо от того, используете ли вы text
, character varying
или character
.
Я думаю, что вы пытаясь оптимизировать то, что не нуждается в оптимизации. Такие попытки часто приносят больше вреда, чем пользы.
Если ваши строки всегда имеют длину 6 символов ASCII, они будут занимать 7 байт в хранилище:
CREATE TABLE x(id bigint, t text);
INSERT INTO x VALUES (1, ' '), (2, '000000');
CREATE EXTENSION pageinspect;
SELECT t_ctid, t_attrs FROM heap_page_item_attrs(get_raw_page('x', 0), 'x');
t_ctid | t_attrs
--------+---------------------------------------------
(0,1) | {"\\x0100000000000000","\\x0f202020202020"}
(0,2) | {"\\x0200000000000000","\\x0f303030303030"}
(2 rows)
Это машина с прямым порядком байтов, как видно из столбца bigint
.
Вы заметите, что значения text
занимают всего 7 байтов каждое. Это вызвано TOAST , который является вашим другом, а не вашим врагом:
TOAST узурпирует два бита слова длины varlena (старшие биты на машинах с прямым порядком байтов) (младшие биты на машинах с прямым порядком байтов), что ограничивает логический размер любого значения типа данных с поддержкой TOAST до 1 ГБ (2 30 - 1 байт). [...] Когда установлен бит самого высокого порядка или самого низкого порядка, значение имеет только однобайтовый заголовок вместо обычного четырехбайтового заголовка, а оставшиеся биты этого байта дают общий размер данных (включая длина байта) в байтах.
0x0F
является двоичным 00001111
: самый правый 1
говорит, что у нас есть только однобайтовый заголовок, а оставшиеся 0000111
(десятичное число 7) являются длиной элемента данных, включая заголовок.
Поскольку ваши значения имеют длину всего 7 байтов, они будут хорошо выровнены с double precision
с потерянным только одним байтом заполнения.
Если вы хотите для микрооптимизации, избегая байтов заполнения, поместите все строковые столбцы рядом друг с другом в конце определения таблицы. С другой стороны, учтите, что PostgreSQL должен пройти go по первым девяти столбцам, чтобы попасть в десятый столбец, поэтому размещение часто используемых столбцов на первом месте приведет к повышению производительности.
Но я бы не стал Слишком много беспокойства по поводу этих проблем: сохранение 4 байтов с использованием integer
вместо bigint
может вызвать большие проблемы позже, если вы поймете, что вам нужны большие числа, и размещение столбцов не имеет значения по сравнению с хорошей моделью данных, хорошо запрашивает и исправляет индексы, когда дело доходит до производительности.