Maison >base de données >tutoriel mysql >Quelle quantité d'espace disque les valeurs NULL dans PostgreSQL consomment-elles réellement ?

Quelle quantité d'espace disque les valeurs NULL dans PostgreSQL consomment-elles réellement ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-26 03:26:10813parcourir

How Much Disk Space Do NULL Values in PostgreSQL Really Consume?

Impact des valeurs NULL sur la consommation d'espace disque de PostgreSQL

Dans PostgreSQL, les exigences de stockage pour les colonnes qui autorisent les valeurs NULL diffèrent de celles qui imposent des valeurs. Considérez la définition de colonne de tableau suivante :

"MyColumn" smallint NULL

Le stockage d'entiers tels que 0, 1 ou toute autre valeur nécessite 2 octets. Cependant, la question se pose : quelle quantité d'espace disque est consommée lorsque « MyColumn » est défini sur NULL ? Occupe-t-il 0 octet ?

Bitmap vs stockage NULL

Contrairement à l'hypothèse initiale d'une consommation de 0 octet, les valeurs NULL ne prennent pas de place. Au lieu de cela, PostgreSQL utilise un bitmap pour suivre l'état NULL de chaque colonne d'une table. Chaque bit du bitmap représente l'état NULL/NOT NULL pour une ligne spécifique.

Cependant, le bitmap n'est pas alloué pour chaque ligne. L’alignement des données est plutôt un facteur à prendre en compte. Le HeapTupleHeader, qui inclut des informations sur chaque ligne, occupe 23 octets. Les données sont alignées pour commencer par des multiples de MAXALIGN (généralement 8 octets), laissant un octet de remplissage pour le bitmap nul.

Espace disque requis

En raison de Ces facteurs, le stockage nul est effectivement gratuit pour les tables comportant jusqu'à 8 colonnes. Cependant, pour les tables comportant plus de colonnes, un espace disque supplémentaire est requis comme suit :

  • Des octets MAXALIGN supplémentaires (généralement 8) sont alloués pour le groupe suivant de 64 colonnes.
  • L'espace est alloué uniquement si au moins une valeur NULL réelle est présente dans la ligne.
  • Les colonnes supprimées marquées comme telles dans le catalogue système occupent toujours un peu dans le bitmap nul.

Tests dans le monde réel

Des tests approfondis ont confirmé ces observations. Pour plus de détails, reportez-vous à la discussion sur :

  • https://dba.stackexchange.com/questions/4452/does-not-using-null-in-postgresql-still-use-a -null-bitmap-in-the-header

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn