Подтвердить что ты не робот

Выполняет ли порядок столбцов в таблице postgres?

В Postgres порядок столбцов в выражении CREATE TABLE влияет на производительность? Рассмотрим следующие два случая:

CREATE TABLE foo (
  a      TEXT, 
  B      VARCHAR(512),
  pkey   INTEGER PRIMARY KEY,
  bar_fk INTEGER REFERENCES bar(pkey),
  C      bytea
); 

против.

CREATE TABLE foo2 (
  pkey   INTEGER PRIMARY KEY,
  bar_fk INTEGER REFERENCES bar(pkey),
  B      VARCHAR(512),      
  a      TEXT, 
  C      bytea
);

будет ли производительность foo2 лучше, чем foo из-за лучшего выравнивания байтов для столбцов? Когда Postgres выполняет CREATE TABLE, он соответствует указанному порядку столбца или реорганизует столбцы в оптимальном порядке для выравнивания или производительности байт?

4b9b3361

Ответ 1

Вопрос 1

Будет ли производительность foo2 лучше, чем foo из-за лучшего байт выравнивание для столбцов?

Да, порядок столбцов оказывает небольшое влияние на производительность. Выравнивание типов является более важным фактором, поскольку оно влияет на площадь на диске. Вы можете минимизировать размер хранилища (играть "колонка tetris" ) и сжимать больше строк на странице данных, что является самым важным фактором скорости.

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

Другим фактором является то, что извлечение значений столбцов происходит немного быстрее, если сначала у вас есть столбцы фиксированного размера. Я цитирую здесь здесь:

Чтобы прочитать данные, вам необходимо изучить каждый атрибут по очереди. Первый проверьте, является ли поле NULL в соответствии с нулевым битовым отображением. Если оно есть, перейдите к следующему. Затем убедитесь, что вы имеете правильное выравнивание. Если поле является полем с фиксированной шириной, тогда все байты просто размещены. Если это поле переменной длины (attlen = -1), то оно немного более сложным. Все типы данных переменной длины разделяют общие структура заголовка struct varlena, которая включает в себя общую длину сохраненное значение и некоторые биты флага.

Существует открытый элемент TODO, чтобы разрешить переупорядочение позиций столбцов в Wiki Postgres, частично по этим причинам.

Вопрос 2

Когда postgres выполняет CREATE TABLE, он выполняет порядок столбцов указан или реорганизует столбцы в оптимальном порядке для байта выравнивание или производительность?

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

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

Ответ 2

Насколько я понимаю, PostgreSQL придерживается порядка, в котором вы вводите столбцы при сохранении записей. Не влияет ли это на производительность. PostgreSQL хранит все данные таблицы на страницах размером 8 КБ. 8kb по умолчанию, но это может быть изменение во время компиляции.

Каждая строка в таблице занимает пробел внутри страницы. Поскольку определение таблицы содержит столбцы переменных, страница может состоять из переменной суммы записей. Что вы хотите сделать, убедитесь, что вы можете поместить столько записей на одну страницу, насколько это возможно. Именно поэтому вы заметите ухудшение производительности, когда таблица имеет огромное количество столбцов или размеров столбцов.

При этом объявление varchar (8192) не означает, что страница будет заполнена одной записью, но объявление CHAR (8192) будет использовать одну целую страницу независимо от количества данных в столбце.

Есть еще одна вещь, которую следует учитывать при объявлении TOASTable типов, таких как столбцы TEXT. Это столбцы, которые могут превышать максимальный размер страницы. Таблица, в которой есть столбцы TOASTable, будет иметь связанную таблицу TOAST для хранения данных, и только указатель на данные сохраняется в таблице. Это может повлиять на производительность, но может быть улучшено с соответствующими индексами в столбцах TOASTable.

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