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?
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.
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:
- Si establece un
char(10)
aNULL
, ocupa 10 bytes (puesto a cero) - Un
int
toma 4 bytes (también a cero). - A
varchar(1 million)
establecido enNULL
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.
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
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).
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.
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