Cuánto tamaño toma el valor" nulo " en SQL Server


Tengo una tabla grande con digamos 10 columnas. 4 de ellos permanece nulo la mayoría de las veces. Tengo una consulta que hace valor nulo toma cualquier tamaño o ningún tamaño en bytes. He leído algunos artículos que algunos de ellos dicen:

Http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

Existe la idea errónea de que si tenemos los valores NULOS en una tabla, no ocupa espacio de almacenamiento. El hecho es que un valor NULO ocupa el espacio – 2 bytes

SQL: Usando valores NULOS vs. valores predeterminados

Un valor NULL en bases de datos es un valor del sistema que ocupa un byte de almacenamiento e indica que un valor no está presente en lugar de un espacio o cero o cualquier otro valor predeterminado.

¿Puede guiarme con respecto al tamaño tomado por valor nulo?

Author: Community, 2010-09-17

4 answers

Si el campo es de ancho fijo, el almacenamiento de NULL ocupa el mismo espacio que cualquier otro valor: el ancho del campo.

Si el campo es ancho variable, el valor NULL no ocupa espacio.

Además del espacio requerido para almacenar un valor null, también hay una sobrecarga para tener una columna nullable. Para cada fila se usa un bit por columna nullable para marcar si el valor de esa columna es nulo o no. Esto es cierto si la columna es fija o variable longitud.


La razón de las discrepancias que usted ha observado en la información de otras fuentes:

  • El comienzo del primer artículo es un poco engañoso. El artículo no habla del costo de almacenar un valor NULL, sino del costo de tener la capacidad de almacenar un valor NULL (es decir, el costo de hacer una columna nullable). Es cierto que cuesta algo en espacio de almacenamiento hacer que una columna sea anulable, pero una vez que lo haya hecho, se necesita menos espacio para almacena un valor NULL de lo que se necesita para almacenar un valor (para columnas de ancho variable).

  • El segundo enlace parece ser una pregunta sobre Microsoft Access. No conozco los detalles de cómo Access almacena NULLs, pero no me sorprendería si es diferente a SQL Server.

 130
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 23:54:02

El siguiente enlace afirma que si la columna es de longitud variable, es decir, varchar entonces NULL toma 0 bytes (más 1 byte se usa para marcar si el valor es NULL o no):

El enlace anterior, así como el siguiente enlace, afirman que para columnas de longitud fija, es decir, char(10) o int, un valor de NULL ocupa la longitud de la columna (más 1 byte para marcar si es NULL o no):

Ejemplos:

  1. Si establece un char(10) a NULL, ocupa 10 bytes (puesto a cero)
  2. Un int toma 4 bytes (también a cero).
  3. A varchar(1 million) establecido en NULL toma 0 bytes (+2 bytes)

Nota: en una ligera tangente, el tamaño de almacenamiento de varchar es la longitud de los datos ingresados + 2 bytes.

 27
Author: JohnB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 23:09:47

De este enlace :

Cada fila tiene un mapa de bits nulo para las columnas que permiten nulos. Si la fila en que columna es nula entonces un poco en el mapa de bits es 1 más es 0.

Para los tipos de datos de tamaño variable el tamaño real es de 0 bytes.

Para el tipo de datos de tamaño fijo tamaño es el tamaño de tipo de datos predeterminado en bytes establecidos en el valor predeterminado (0 para numbers, " for chars).

 5
Author: klabranche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 22:07:26

Almacenar un valor NULO no ocupa ningún espacio.

" El hecho es que un valor NULO ocupa espacio-2 bytes."

Esto es un error that eso es 2 bytes por fila, y estoy bastante seguro de que todas las filas usan esos 2 bytes independientemente de si hay columnas nullables.

Un valor NULO en bases de datos es un sistema valor que ocupa un byte de almacenamiento

Se trata de bases de datos en general, no específicamente SQL Servidor. SQL Server no utiliza 1 byte para almacenar valores NULOS.

 4
Author: Gabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-16 22:18:26