Fonctionnement des pages et étendues

L'unité fondamentale du stockage des données dans SQL Server est la page. L'espace disque alloué à un fichier de données (.mdf ou .ndf) d'une base de données est logiquement divisé en pages numérotées consécutivement de 0 à n. Les opérations d'E/S disque sont effectuées au niveau page. En d'autres termes, SQL Server lit ou écrit des pages entières de données.

Les extensions sont une collection de huit pages physiques contiguës ; elles sont utilisées pour gérer les pages de manière efficace. Toutes les pages sont stockées dans des extensions.

Pages

Dans SQL Server, la taille des pages est de 8 Ko. Autrement dit, les bases de données SQL Server disposent de 128 pages par mégaoctet. Chaque page commence par un en-tête de 96 octets qui sert à stocker les informations système relatives à la page. Ces informations sont notamment le numéro de page, le type de page, la quantité d'espace disponible sur la page et l'ID de l'unité d'allocation de l'objet auquel appartient la page.

Le tableau suivant présente les types de page utilisés dans les fichiers de données d'une base de données SQL Server.

Type de page

Contenu

Données

Lignes de données contenant toutes les données, à l'exception des données text, ntext, image, nvarchar(max), varchar(max), varbinary(max) et xml lorsque l'option text in row a la valeur ON.

Index

Des entrées d'index.

Texte/image

Types de données LOB (Large OBject) :

  • Données text, ntext, image, nvarchar(max), varchar(max), varbinary(max) et xml.

Colonnes de longueur variable lorsque la ligne de données dépasse 8 Ko :

  • varchar, nvarchar, varbinary et sql_variant

GAM (Global Allocation Map), SGAM (Shared Global Allocation Map)

Informations précisant si ces extensions sont allouées.

PFS (Page Free Space)

Informations sur l'allocation des pages et sur l'espace disponible sur ces pages.

IAM (Index Allocation Map)

Informations sur les extensions utilisées par une table ou un index par unité l'allocation.

BCM (Bulk Changed Map)

Informations sur les extensions modifiées par des opérations en bloc depuis la dernière instruction BACKUP LOG par unité d'allocation.

DCM (Differential Changed Map)

Informations sur les extensions qui ont été modifiées depuis la dernière instruction BACKUP DATABASE par unité d'allocation.

Notes

Les fichiers journaux ne contiennent pas de pages mais une série d'enregistrements de fichiers journaux.

Les lignes de données sont placées séquentiellement sur la page, immédiatement à partir de l'en-tête. Une table de décalage de lignes débute à la fin de la page et chaque table de décalage de lignes contient une entrée pour chaque ligne de la page. Chaque entrée enregistre la distance à laquelle se trouve le premier octet de la ligne par rapport au début de la page. Les entrées de la table de décalage de lignes sont inversées par rapport à l'ordre des lignes sur la page.

Page de données SQL Server avec décalages de ligne

Prise en charge des lignes de grande taille

Les lignes ne peuvent pas couvrir plusieurs pages, mais des parties d'une ligne peuvent être déplacées hors de la page de la ligne, afin que la ligne puisse atteindre une très grande taille. La quantité maximale de données et de surcharge contenue dans une seule ligne d'une page est de 8 060 octets (8 Ko). Toutefois, cette valeur ne tient pas compte des données stockées dans le type de page Texte/Image. Cette restriction est levée pour les tables qui contiennent des colonnes varchar, nvarchar, varbinary ou sql_variant. Lorsque la taille totale de ligne de toutes les colonnes de longueur fixe et variable d'une table dépasse la limite des 8 060 octets, SQL Server déplace de manière dynamique une ou plusieurs colonnes de longueur variable dans les pages de l'unité d'allocation ROW_OVERFLOW_DATA, en commençant par la colonne dont la largeur est la plus grande. Cette opération est réalisée chaque fois qu'une opération d'insertion ou de mise à jour augmente la taille totale de la ligne au-delà de la limite de 8 060 octets. Lorsqu'une colonne est déplacée dans une page de l'unité d'allocation ROW_OVERFLOW_DATA, un pointeur de 24 octets est conservé sur la page d'origine dans l'unité d'allocation IN_ROW_DATA. Si une opération ultérieure réduit la taille de la ligne, SQL Server redéplace de manière dynamique les colonnes dans la page de données d'origine. Pour plus d'informations, consultez Données de dépassement de ligne de plus de 8 Ko.

Extensions

Les extensions constituent l'unité de base dans laquelle l'espace est géré. Une extension est constituée de 8 pages contiguës, soit 64 Ko. Autrement dit, les bases de données SQL Server possèdent 16 extensions par mégaoctet.

Afin d'optimiser la gestion de l'espace, SQL Server n'affecte pas d'extensions complètes aux tables possédant de petites quantités de données. SQL Server contient deux types d'extensions :

  • Les extensions uniformes appartiennent à un objet unique ; les huit pages de l'extension ne peuvent être utilisées que par l'objet propriétaire.

  • Les extensions mixtes sont partagées par huit objets au plus. Chacune des huit pages de l'extension peut être la propriété d'un objet différent.

Une nouvelle table ou un nouvel index est en général affecté de pages issues d'extensions mixtes. Lorsque la table ou l'index atteint huit pages, il bascule à l'utilisation des extensions uniformes pour les allocations suivantes. Si vous créez un index sur une table existante qui possède un nombre de lignes suffisant pour générer huit pages dans l'index, toutes les allocations à l'index se trouvent dans des extensions uniformes.

Étendues mixtes et uniformes