Как рассчитать объем памяти, используемый значением NULL?
Кажется, действительно трудно найти точную информацию об этом. В MSDN есть статья о разреженных столбцах и о том, какие нулевые процентные пороговые значения следует учитывать при их использовании. Но факты, касающиеся использования пустого пространства хранения по умолчанию, кажутся очень сложными.
Некоторые источники утверждают, что значения NULL не занимают места вообще, но это означало бы, что разреженные столбцы были бы бессмысленными в первую очередь. Некоторые утверждают, что только нулевое растровое изображение в определении таблицы добавляет бит, представляющий каждый обнуляемый столбец, но никаких дополнительных затрат нет. Некоторые утверждают, что столбцы фиксированной длины (char, int, bigint и т. Д.) Фактически занимают одинаковый объем памяти независимо от того, является ли значение нулевым или нет.
Так что же на самом деле?
Допустим, у меня есть список всех пустых столбцов в нашей БД с общим количеством строк в таблице и количеством строк NULL на каждый столбец и тип. Как бы я точно вычислил, сколько места используют значения NULL сейчас, чтобы я мог точно предсказать, сколько места будет сэкономлено, изменив вместо этого столбцы для разрежения? Я могу просто добавить 4-байтовые издержки к ненулевым строкам, но это не поможет, когда я не знаю, что делать с пустыми строками?
1 ответ
Для типов с фиксированной длиной, таких как
int NULL
, он всегда использует длину типа (то есть 4 байта для типа int, независимо от того, установлено ли оно в NULL или NOT NULL).Для типов переменной длины требуется 0 байтов, чтобы сохранить NULL + 2 байта в списке смещений столбцов переменной длины. Это используется для записи, где каждое значение переменной длины действительно хранится в строке на странице.
Кроме того, флаг NULL или NOT NULL использует 1 бит для каждого столбца. Таблица с 12 столбцами будет использовать 12/8 байтов (битовая карта NULL =2 байта).
Эта ссылка даст вам гораздо больше информации по теме
Как только вы узнаете процент NULL, вы можете посмотреть на эту ссылку для оценки потенциальной выгоды. Разреженный экономит место на нулевом значении, но потребует больше места для ненулевых значений.