2012-04-04 3 views
5

Учитывая большой стол (10-100 миллионов строк), что является лучшим способом добавить к нему дополнительные (неиндексированные) столбцы?PostgreSQL: влияние дополнительных столбцов

  1. Просто добавьте столбцы.
  2. Создайте отдельную таблицу для каждого дополнительного столбца и используйте соединения, если хотите получить дополнительные значения.

Возникает ли ответ в зависимости от того, являются ли дополнительные столбцы плотными (в основном не нулевыми) или разреженными (в основном, null)?

ответ

13

Столбец с значением NULL может быть добавлен в строку без каких-либо изменений на остальной странице данных in most cases. Только один бит должен быть установлен в NULL битовой маске. Итак, да, разреженная колонка намного дешевле добавить в большинстве случаев.

Полезно ли создать отдельную таблицу 1: 1 для дополнительных колонок очень сильно зависит от варианта использования. Это, как правило, дороже. Во-первых, накладные расходы на 28 байтов (заголовок heaptuple и указатель на позицию) на строку и некоторые дополнительные накладные расходы на таблицу. Также намного дороже JOIN строк в запросе, чем читать их в одной части. И вам нужно добавить столбец первичного/внешнего ключа и индекс. Разделение может быть хорошей идеей, если вам не нужны дополнительные столбцы в большинстве запросов. В основном это плохая идея.

Добавление столбца происходит быстро в PostgreSQL. Обновление Значения в столбце - это то, что может быть дорогостоящим, потому что каждый UPDATE пишет новую строку (из-за модели MVCC). Поэтому рекомендуется обновлять сразу несколько столбцов.

Database page layout in the manual.

Как рассчитать размеры строк:

+0

'есть накладные расходы 28 байт (heaptuple заголовок плюс указатель элемента) в строку и некоторых дополнительные накладные расходы на таблицу. Просто для подтверждения, означает ли это, что сквозная таблица с тремя 4-байтовыми целыми числами (первичный ключ + 2 fo reign keys) займет 28 + 12 байт в строке? – dtgq

+1

@DavidTan: На самом деле, всего 44 байт в строке. 24 + 4 + 3 * 4 + 4 байта выравнивания. Я добавил ссылки на более подробное объяснение выше. –

Смежные вопросы