Столбец с значением NULL
может быть добавлен в строку без каких-либо изменений на остальной странице данных in most cases. Только один бит должен быть установлен в NULL битовой маске. Итак, да, разреженная колонка намного дешевле добавить в большинстве случаев.
Полезно ли создать отдельную таблицу 1: 1 для дополнительных колонок очень сильно зависит от варианта использования. Это, как правило, дороже. Во-первых, накладные расходы на 28 байтов (заголовок heaptuple и указатель на позицию) на строку и некоторые дополнительные накладные расходы на таблицу. Также намного дороже JOIN
строк в запросе, чем читать их в одной части. И вам нужно добавить столбец первичного/внешнего ключа и индекс. Разделение может быть хорошей идеей, если вам не нужны дополнительные столбцы в большинстве запросов. В основном это плохая идея.
Добавление столбца происходит быстро в PostgreSQL. Обновление Значения в столбце - это то, что может быть дорогостоящим, потому что каждый UPDATE
пишет новую строку (из-за модели MVCC). Поэтому рекомендуется обновлять сразу несколько столбцов.
Database page layout in the manual.
Как рассчитать размеры строк:
'есть накладные расходы 28 байт (heaptuple заголовок плюс указатель элемента) в строку и некоторых дополнительные накладные расходы на таблицу. Просто для подтверждения, означает ли это, что сквозная таблица с тремя 4-байтовыми целыми числами (первичный ключ + 2 fo reign keys) займет 28 + 12 байт в строке? – dtgq
@DavidTan: На самом деле, всего 44 байт в строке. 24 + 4 + 3 * 4 + 4 байта выравнивания. Я добавил ссылки на более подробное объяснение выше. –