web-dev-qa-db-fra.com

Quelle taille prend la valeur "Null" dans SQL Server

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.

112
Rocky Singh

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.

140
Mark Byers

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:

  1. Si vous définissez un char(10) sur NULL, il occupe 10 octets (mis à zéro)
  2. Un int prend 4 octets (également mis à zéro).
  3. Une 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.

30
JohnB

à partir de ce lien :

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).

5
klabranche

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.

4
Gabe