2010-09-16 18 views
92

Tengo una tabla grande con 10 columnas. 4 de ellos permanecen nulos la mayoría de las veces. Tengo una consulta que hace que el valor nulo tome cualquier tamaño o ningún tamaño en bytes. He leído algunos artículos algunos de ellos están diciendo:Cuánto tamaño tiene el valor "nulo" en SQL Server

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

Hay una idea errónea de que si tenemos los valores NULL en una tabla que no ocupa espacio de almacenamiento. El hecho es, un valor NULL ocupa el espacio - 2 bytes

SQL: Using NULL values vs. default values

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

Por favor, me pueden guiar con respecto al tamaño tomado por el valor nulo.

Respuesta

117

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

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

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


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

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

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

+0

@Mark "Es cierto que cuesta algo en el espacio de almacenamiento hacer que una columna se detenga, pero una vez que lo haya hecho, se necesita menos espacio para almacenar un valor NULL que para almacenar un valor (para columnas de ancho variable)" esto quiere decir que se necesita 1 bit como el tamaño tomado en la memoria para los tipos de datos variables. –

+9

La unidad de memoria direccionable más pequeña en la mayoría de los sistemas informáticos es un 'byte' (típicamente 8 bits). Entonces, en realidad, un 'bit' toma un' byte'. Gran respuesta Marca: +1. – JohnB

+13

Sin embargo, un segundo bit, y un tercer bit, y todo el camino hasta un octavo bit caben en el mismo byte. –

5

From this link:

Cada fila tiene un mapa de bits nulos para las columnas que permiten valores nulos. Si la fila de esa columna es nulo entonces un poco en el mapa de bits es 1 cosa es 0.

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

Para el tamaño de tipo de datos fija la tamaño acctual es el tamaño tipo de datos predeterminado en bytes fijados en el valor predeterminado (0 para números '', para caracteres).

+0

¿Quiere decir para tipos de datos como nvarchar (max) varchar (max) voluntad nulo toma 0 bytes y para int, char, etc que tomará el tamaño por defecto a los valores predeterminados que tienen? –

26

el siguiente enlace afirma que si la columna es de longitud variable, es decir, varchar entonces NULL tiene 0 bytes (además de 1 byte se utiliza para la bandera de 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 de 1 byte a la bandera ya sea NULL o no):

Ejemplos:

  1. Si establece un char(10) a NULL, que ocupa 10 bytes (cero)
  2. Un int toma 4 bytes (también se ha reducido a cero).
  3. A varchar(1 million) conjunto a NULL tiene 0 bytes (+ 2 bytes)

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

+0

alojaría un varchar almacenar un NULL tomar 0 + 2 + 1 (de arriba NULL) bytes? – Akash

4

El almacenamiento de un valor NULO no ocupa espacio.

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

Este es un error - que es 2 bytes por fila , y estoy bastante seguro de que todas las filas utilizan esos 2 bytes, independientemente de si hay algún columnas anulables.

un valor nulo en las bases de datos es un sistema valor que ocupa un byte de almacenamiento

Esto está hablando de bases de datos en general, no específicamente de SQL Server. SQL Server no usa 1 byte para almacenar valores NULL.

Cuestiones relacionadas