Занимают ли NULL место в индексах postgresql? - PullRequest
5 голосов
/ 07 февраля 2011

Хотя легко документироваться, что NULL занимают только 1 бит в заголовке кортежа postgresql для строки, сколько места занимают NULL в INDEX пустого столбца (не кортежа, а индекса)? Это тот же 1 бит в индексе, что и в кортеже, или это полный размер типа данных столбца (например, целое число = 4 байта)?

Контекст для вопроса заключается в том, что у меня есть таблица postgresql, в которой есть 3 ссылочных столбца (например, foo_id, bar_id и baz_id), и для любой строки значение имеет только один из этих столбцов (остальные 2 столбца НОЛЬ). Однако мне нужно, чтобы все 3 столбца были проиндексированы. Предполагая, что каждый столбец является целым числом (4 байта в postgresql), каждая строка должна занимать 4 байта (для ненулевого столбца) плюс 2 бита (для 2 пустых столбцов). Однако, если бы я добавил индексы для всех 3 столбцов, хранилище для 3 индексов было бы либо 12 байтами (если индекс занимает полные 4 байта для нулевого значения), либо теми же 4 байтами + 2 бита, что и в сам кортеж.

1 Ответ

1 голос
/ 07 февраля 2011

Процедуры доступа btree используют PageGetItem () для получения фактического ключа из индекса.Поэтому я считаю, что страницы индекса btree используют ту же схему хранения, что и обычные страницы кучи (включая маску обнуляемости), они просто имеют дополнительную навигационную информацию в «специальной» области страницы для хранения всех указателей btree.

...