J'ai une grande table avec disons 10 colonnes. 4 d'entre eux restent nuls la plupart du temps. J'ai une requête qui fait la valeur null prend n'importe quelle taille ou aucune taille en octets. J'ai lu quelques articles que certains disent:
http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html
Il existe une idée fausse selon laquelle si nous avons les valeurs NULL dans une table, elles n'occupent pas d'espace de stockage. Le fait est qu'une valeur NULL occupe un espace - 2 octets
SQL: Utilisation des valeurs NULL et des valeurs par défaut
Une valeur
NULL
dans une base de données est une valeur système qui occupe un octet de stockage et indique qu'une valeur n'est pas présente par opposition à un espace ou à un zéro ou à toute autre valeur par défaut. .
Pouvez-vous s'il vous plaît me guider concernant la taille prise par une valeur nulle.
Si le champ a une largeur fixe, le stockage de NULL prend le même espace que toute autre valeur - la largeur du champ.
Si le champ est de largeur variable, la valeur NULL n'occupe aucun espace.
En plus de l'espace requis pour stocker une valeur null, il existe également une surcharge pour avoir une colonne nullable. Pour chaque ligne, un bit est utilisé par colonne nullable pour indiquer si la valeur de cette colonne est null ou non. Cela est vrai que la colonne soit de longueur fixe ou variable.
La raison des divergences que vous avez observées dans les informations provenant d'autres sources:
Le début du premier article est un peu trompeur. L'article ne parle pas du coût de stockage d'une valeur NULL, mais du coût de la capacité de stocker une valeur NULL (c'est-à-dire le coût de la création d'une colonne nullable). Il est vrai que rendre une colonne nuls, cela coûte quelque chose en espace de stockage, mais une fois que vous l'avez fait, cela prend moins d'espace pour stocker une valeur NULL que pour stocker une valeur (pour les colonnes de largeur variable).
Le deuxième lien semble être une question sur Microsoft Access. Je ne connais pas les détails de la manière dont Access stocke les valeurs NULL, mais je ne serais pas surpris que ce soit différent de SQL Server.
Le lien suivant indique que si la colonne a une longueur variable, c’est-à-dire varchar
alors NULL
prend 0 octet (un octet plus est utilisé pour indiquer si valeur est NULL
ou non):
Le lien ci-dessus, ainsi que le lien ci-dessous, indiquent que pour les colonnes de longueur fixe, c'est-à-dire char(10)
ou int
, une valeur de NULL
occupe la longueur de la colonne ( plus 1 octet pour indiquer s'il s'agit de NULL
ou non):
Exemples:
char(10)
sur NULL
, il occupe 10 octets (mis à zéro)int
prend 4 octets (également mis à zéro).varchar(1 million)
définie sur NULL
prend 0 octet (+ 2 octets) Remarque: sur une légère tangente, la taille de stockage de varchar
correspond à la longueur des données saisies + 2 octets.
Chaque ligne a un bitmap null pour les colonnes qui autorisent les valeurs null. Si la ligne de cette colonne est nulle, alors un bit dans le bitmap est 1, sinon 0.
Pour les types de données de taille variable, la taille réelle est de 0 octet.
Pour un type de données de taille fixe, la taille réelle est la taille de type de données par défaut, en octets, définie sur la valeur par défaut (0 pour les nombres, '' pour les caractères).
Stocker une valeur NULL ne prend aucun espace.
"Le fait est qu'une valeur NULL occupe un espace - 2 octets."
Ceci est une idée fausse - c'est 2 octets par ligne, et je suis à peu près sûr que toutes les lignes utilisent ces 2 octets, qu'il y ait ou non des colonnes nullables.
Une valeur NULL dans les bases de données est une valeur système qui occupe un octet de stockage.
Il s’agit des bases de données en général, pas spécifiquement SQL Server. SQL Server n'utilise pas 1 octet pour stocker les valeurs NULL.