2009-02-17 2 views
22

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

Разъяснение: вопрос относится не к тому, что происходит, когда столбец «обнуляемым» (Это стоит еще немного, как Kritsen & ГБН указал,). Вопрос в том, есть ли какое-либо сохранение, когда столбец фактически является нулевым (в некоторой определенной строке).

...

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

ответ

18

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

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

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

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

+2

Если нулевая длина означает пустую строку, что SQL используется для пустых строк? они не то же самое. – Andy

9

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

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

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

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

2

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

Пример: обнуляемый столбец VARCHAR называется отчество

  • строка 1, «Боб» сохраняются как смещение, 3 байта для ЛПП, 2 байта для длины «Боба»
  • строки 2, NULL строка не сохраняется как значение, как «боб», но в заголовке строки

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

Link 1 Link 2

3

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

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

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

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

0

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

0

В 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;