127 votes

Combien de taille "Null" valeur prend dans SQL Server

Je vais avoir un grand tableau de 10 colonnes. 4 d'entre eux reste nulle la plupart du temps. J'ai une requête qui n'a nulle valeur prend n'importe quelle taille ou pas de taille, en octets. J'ai lu quelques articles, certains d'entre eux sont en train de dire :

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html "Il ya une idée fausse que si nous avons les valeurs NULL dans une table, il n'occupe pas d'espace de stockage. Le fait est, une valeur NULL occupe l'espace de 2 octets."

http://stackoverflow.com/questions/2116719/sql-using-null-values-vs-default-values Une valeur NULL dans les bases de données est un système de valeur qui occupe un octet de stockage et indique qu'une valeur n'est pas présente, par opposition à un espace ou à zéro ou à toute autre valeur par défaut.

Pouvez-vous svp me guider concernant la taille prise par la valeur null.

153voto

Mark Byers Points 318575

Si le champ est de largeur fixe le stockage NULL prend le même espace que n'importe quelle autre valeur - la largeur du champ.

Si le champ est de largeur variable la valeur NULL prend pas de place.

En plus de l'espace nécessaire pour stocker une valeur null il y a aussi un rétroprojecteur pour avoir une colonne nullable. Pour chaque ligne d'un bit est utilisé par colonne nullable à marquer si la valeur de cette colonne est null ou pas. Ceci est vrai si la colonne est de longueur fixe ou variable.


La raison pour laquelle les écarts que vous avez observé dans l'information 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 le coût d'avoir la capacité de stocker une valeur NULL (j'.e le coût d'une colonne nullable). C'est vrai que ça coûte quelque chose dans l'espace de stockage de faire une colonne nullable, mais une fois que vous avez fait que ça prend moins de place pour stocker une valeur NULL qu'il faut pour stocker une valeur (pour largeur variable de colonnes).

  • Le second lien semble être une question à propos de Microsoft Access. Je ne connais pas les détails de la façon dont Access stocke les valeurs Null, mais je ne serais pas surpris si elle est différente de SQL Server.

31voto

JohnB Points 6869

Le lien suivant valoir que, si la colonne est de longueur variable, c'est à dire varchar alors NULL prend 0 octets (plus de 1 octet est utilisé pour signaler si la valeur est NULL ou pas):

Le lien ci-dessus, ainsi que le lien ci-dessous, la demande qui fixe la longueur de colonnes, c'est à dire char(10) ou int, une valeur de NULL occupe la longueur de la colonne (plus 1 octet indicateur de savoir si c'est NULL ou pas):

Exemples:

  1. Si vous définissez un char(10) de NULL, il occupe 10 octets (mise à zéro)
  2. Un int prend 4 octets (également mis à zéro).
  3. Un varchar(1 million) ensemble de NULL prend 0 octets (+ 2 octets)

Remarque: une légère tangente, la taille de stockage de l' varchar est la longueur des données d'entrée + 2 octets.

5voto

klabranche Points 15518

À partir de ce lien:

Chaque ligne a un bitmap null pour les colonnes qui autorise les valeurs null. Si la ligne de cette la colonne est null alors un peu dans le bitmap est 1 sinon 0.

Pour la variable de la taille des types de données de la acctual taille est de 0 octets.

Pour une taille fixe de type de données de la acctual la taille est le type de données par défaut de la taille de les octets de définir la valeur par défaut (0 pour numéros, " la srcea).

4voto

Gabe Points 49718

Stockage d'une valeur NULL ne prend pas tout l'espace.

"Le fait est, une valeur NULL occupe l'espace de 2 octets."

C'est une idée fausse -- 2 octets par ligne, et je suis assez sûr que toutes les lignes d'utiliser ces 2 octets, indépendamment de savoir si il y a un nullable colonnes.

Une valeur NULL dans les bases de données est un système de la valeur que prend un octet de de stockage

C'est parler de bases de données en général, pas spécifiquement de SQL Server. SQL Server n'utilise pas 1 octet pour stocker les valeurs NULL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X