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

Пробел, используемый нулями в базе данных

Если столбец имеет значение NULL, это влияет на пространство, используемое столбцом? Используется ли пространство для определения столбца? Это зависит от базы данных и базы данных. (Меня особенно интересует SQL Server 2000.)

Разъяснение: Вопрос касается не того, что происходит, когда столбец "nullable" (это стоит еще один бит, как указывал Критсен и gbn). Вопрос в том, есть ли какое-либо сохранение, когда столбец фактически является нулевым (в некоторой определенной строке).

...

Cadaeic предоставил ответ для SQL Server, который, похоже, не сэкономит на SQL Server до версии 2008 года, тогда как согласно Quassnoi вы можете получить экономию в Oracle, если нулевые столбцы находятся в конце. Спасибо за ответы, они были полезны.

4b9b3361

Ответ 1

Хранение NULL в столбце не требует особых затрат или экономии места. Для данных фиксированной длины все пространство сохраняется.

С другой стороны, для данных переменной длины требуется только длина данных плюс служебные данные для хранения фактической длины. Например, VARCHAR (n) будет использовать 2 байта данных для указания фактической длины, поэтому требуемое пространство хранения всегда равно n + 2.

Кроме того, следует отметить, что если SET ANSI_PADDING ON, a char (n) со значением NULL будет вести себя как VARCHAR (n).

Независимо от этого, вы не сможете распознать "экономию" пространства при хранении NULL при использовании SQL Server 2000 или SQL Server 2005. В SQL Server 2008 представлена ​​концепция разреженного столбца, которая может обеспечить экономию для столбцов, которые в основном NULL.

Ответ 2

SQL Server имеет бит для указания NULL. Такой бит не используется, если столбец определяется как NOT NULL

VARCHAR использует переменную длину для хранения данных (и, следовательно, имеет накладные расходы, указывающие, сколько времени фактические данные), тогда как CHAR является фиксированной шириной.

Итак, на этой основе a CHAR (1) NOT NULL "короче", чем VARCHAR (1) NOT NULL, так как VARCHAR нужен индикатор длины, а CHAR всегда будет использовать только один байт.

EDIT: обратите внимание, что наличие поля BIT, которое позволяет NULL, требует двух бит для его сохранения! Я часто вижу поля BIT, где это не рассматривалось, не нужно хранить NULL, но не было установлено NOT NULL, так что они теряют немного непреднамеренно

Ответ 3

В Oracle это зависит от типа столбца и его положения в строке.

Если столбцы NULL являются последними в строке, то они вообще не занимают места. Oracle добавляет общий размер строки к каждой строке, все, что не подходит, считается NULL.

Если после столбца NULL есть некоторые данные не NULL, то NULL сохраняется как один байт 0xFF (то есть NULL type).

Пусто VARCHAR2 эквивалентно NULL. Если вы проверите тип литерала NULL, возвращенного из списка SELECT, он даст вам VARCHAR2(0).

Ответ 4

Он хранится в растровом изображении, а не как значение столбца.

Пример: нулевой столбчик varchar с именем middle name

  • строка 1, "bob" сохраняется как смещение, 3 байта для bob, 2 байта для длины "bob"
  • строка 2, строка NULL не сохраняется как значение, подобное "bob" , но в заголовке строки

Если у вас очень маленькая таблица, скажем, один столбец char (1), то он более эффективен

Ссылка 1 Ссылка 2

Ответ 5

Количество байтов, используемых строкой, меньше, если вы используете типы данных varchar или nvarchar. Вот почему вы можете создать таблицу (но не обязательно), которая имеет больше потенциальных байтов, чем может быть фактически записана в записи.

Ответ 6

В Oracle 11G у меня тоже была такая же ситуация. Вы не можете освободить (проверьте пространство dba_segments), занимаемое существующими строками, установив столбец NULL независимо от его положения, посередине или в конце.

UPDATE AUCORE_QA.SYSTEM_AUDIT_LOGS SET KEY=NULL;
SELECT OWNER, TABLESPACE_NAME , SEGMENT_NAME,SEGMENT_TYPE,BYTES/1024/1024 MB
FROM DBA_SEGMENTS 
WHERE OWNER LIKE 'AUCORE_QA' AND SEGMENT_TYPE='TABLE' AND SEGMENT_NAME like '%AUDIT_LOG%'
ORDER BY BYTES DESC;

Однако я сделал столбец "Nullable" и смог увидеть экономию экономии для последующих вставленных строк.

ALTER TABLE SYSTEM_AUDIT_LOGS MODIFY KEY NULL;