Guide d’architecture des pages et des étenduesPages and Extents Architecture Guide

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database ouiAzure Synapse Analytics (SQL DW) ouiParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

L’unité fondamentale du stockage des données dans SQL ServerSQL Server est la page.The page is the fundamental unit of data storage in SQL ServerSQL Server. Une étendue est une collection de huit pages physiquement contiguës.An extent is a collection of eight physically contiguous pages. Les étendues sont une aide précieuse pour la gestion des pages.Extents help efficiently manage pages. Ce guide décrit les structures de données utilisées pour gérer les pages et les étendues dans toutes les versions de SQL Server.This guide describes the data structures that are used to manage pages and extents in all versions of SQL Server. Il est essentiel de comprendre l'architecture des pages et étendues pour concevoir et développer des bases de données performantes.Understanding the architecture of pages and extents is important for designing and developing databases that perform efficiently.

Pages et étenduesPages and Extents

L’unité fondamentale du stockage des données dans SQL ServerSQL Server est la page.The fundamental unit of data storage in SQL ServerSQL Server is the 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.The disk space allocated to a data file (.mdf or .ndf) in a database is logically divided into pages numbered contiguously from 0 to n. Les opérations d'E/S disque sont effectuées au niveau page.Disk I/O operations are performed at the page level. En d’autres termes, SQL Server lit ou écrit des pages entières de données.That is, SQL Server reads or writes whole data pages.

Les extensions sont une collection de huit pages physiques contiguës ; elles sont utilisées pour gérer les pages de manière efficace.Extents are a collection of eight physically contiguous pages and are used to efficiently manage the pages. Toutes les pages sont organisées en étendues.All pages are organized into extents.

PagesPages

Considérez un livre ordinaire : tout son contenu est écrit sur des pages.Take a regular book: all content in it is written on pages. À l’image d’un livre, dans SQL Server, toutes les lignes de données sont écrites sur des pages.Similar to a book, in SQL Server all the data rows are written on pages. Dans un livre, toutes les pages ont la même taille physique.In a book, all pages are the same physical size. De même, dans SQL Server, toutes les pages de données ont la même taille : 8 kilo-octets.Similarly, in SQL Server all data pages are the same size - 8 kilobytes. Dans un livre, la plupart des pages contiennent les données (le contenu principal du livre), tandis que certaines pages contiennent des métadonnées sur le contenu (par exemple, une table des matières et un index).In a book most pages contain the data - the main content of the book - and some pages contain metadata about the content - for example table of contents and index. Là encore, SQL Server n’est pas différent : la plupart des pages contiennent des lignes de données réelles stockées par les utilisateurs ; il s’agit de pages de données et de pages de texte/image (pour les cas spéciaux).Again, SQL Server is not different: most pages contain actual rows of data which were stored by users; these are called Data pages and text/image pages (for special cases). Les pages d’index contiennent des références d’index sur l’emplacement des données et, enfin, il existe des pages système qui stockent de nombreuses métadonnées sur l’organisation des données (pages BCM, PFS, GAM, SGAM, IAM, DCM).The Index pages contain index references about where the data is and finally there are system pages that store variety of metadata about the organization of the data (PFS, GAM, SGAM, IAM, DCM, BCM pages). Consultez le tableau ci-dessous pour connaître les types de page et leur description.See table below for page types and their description.

Comme mentionné, dans SQL ServerSQL Server, la taille des pages est de 8 Ko.As mentioned, in SQL ServerSQL Server, the page size is 8-KB. Autrement dit, les bases de données SQL ServerSQL Server disposent de 128 pages par mégaoctet.This means SQL ServerSQL Server databases have 128 pages per megabyte. Chaque page commence par un en-tête de 96 octets qui sert à stocker les informations système relatives à la page.Each page begins with a 96-byte header that is used to store system information about the 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.This information includes the page number, page type, the amount of free space on the page, and the allocation unit ID of the object that owns the 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 ServerSQL Server.The following table shows the page types used in the data files of a SQL ServerSQL Server database.

Type de pagePage type ContentsContents
DonnéesData Lignes de données avec toutes les données, sauf text, ntext, image, nvarchar(max), varchar(max), varbinary(max) et xml, lorsque le texte dans la ligne est défini sur ACTIVÉ (ON).Data rows with all data, except text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data, when text in row is set to ON.
IndexIndex Des entrées d'index.Index entries.
Texte/imageText/Image Types de données d’objets volumineux : (text, ntext, image, nvarchar(max), varchar(max), varbinary(max) et données xml)Large object data types: (text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data)
Colonnes de longueur variable lorsque la ligne de données dépasse 8 Ko : (varchar, nvarchar, varbinary et sql_variant)Variable length columns when the data row exceeds 8 KB: (varchar, nvarchar, varbinary, and sql_variant)
GAM (Global Allocation Map), SGAM (Shared Global Allocation Map)Global Allocation Map, Shared Global Allocation Map Informations précisant si ces extensions sont allouées.Information about whether extents are allocated.
Page Free Space (PFS)Page Free Space (PFS) Informations sur l'allocation des pages et sur l'espace disponible sur ces pages.Information about page allocation and free space available on pages.
page IAM (Index Allocation Map)Index Allocation Map Informations sur les extensions utilisées par une table ou un index par unité l'allocation.Information about extents used by a table or index per allocation unit.
mappage modifié en blocBulk 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.Information about extents modified by bulk operations since the last BACKUP LOG statement per allocation unit.
mappage de modification différentielleDifferential Changed Map Informations sur les extensions qui ont été modifiées depuis la dernière instruction BACKUP DATABASE par unité d'allocation.Information about extents that have changed since the last BACKUP DATABASE statement per allocation unit.

Notes

Les fichiers journaux ne contiennent pas de pages mais une série d'enregistrements de fichiers journaux.Log files do not contain pages; they contain a series of log records.

Les lignes de données sont placées séquentiellement sur la page, immédiatement à partir de l'en-tête.Data rows are put on the page serially, starting immediately after the header. 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.A row offset table starts at the end of the page, and each row offset table contains one entry for each row on the page. Chaque entrée de décalage de lignes enregistre la distance à laquelle se trouve le premier octet de la ligne par rapport au début de la page.Each row offset entry records how far the first byte of the row is from the start of the page. Ainsi, la fonction de la table de décalage de lignes consiste à aider SQL Server à trouver des lignes dans une page très rapidement.Thus, the function of the row offset table is to help SQL Server locate rows on a page very quickly. Les entrées de la table de décalage de lignes sont inversées par rapport à l'ordre des lignes sur la page.The entries in the row offset table are in reverse sequence from the sequence of the rows on the page.

page_architecture

Prise en charge des lignes de grande tailleLarge Row Support

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.Rows cannot span pages, however portions of the row may be moved off the row's page so that the row can actually be very large. La quantité maximale de données et de surcharge contenue dans une seule ligne d'une page est de 8 060 octets (8 Ko).The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8-KB). Toutefois, cette valeur ne tient pas compte des données stockées dans le type de page Texte/Image.However, this does not include the data stored in the Text/Image page type.

Cette restriction est assouplie pour les tables qui contiennent des colonnes varchar, nvarchar, varbinary ou sql_variant.This restriction is relaxed for tables that contain varchar, nvarchar, varbinary, or sql_variant columns. 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 ServerSQL 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.When the total row size of all fixed and variable columns in a table exceeds the 8,060-byte limitation, SQL ServerSQL Server dynamically moves one or more variable length columns to pages in the ROW_OVERFLOW_DATA allocation unit, starting with the column with the largest width.

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.This is done whenever an insert or update operation increases the total size of the row beyond the 8,060-byte limit. 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.When a column is moved to a page in the ROW_OVERFLOW_DATA allocation unit, a 24-byte pointer on the original page in the IN_ROW_DATA allocation unit is maintained. Si une opération ultérieure réduit la taille de la ligne, SQL ServerSQL Server redéplace de manière dynamique les colonnes dans la page de données d'origine.If a subsequent operation reduces the row size, SQL ServerSQL Server dynamically moves the columns back to the original data page.

Observations relatives au dépassement de ligneRow-Overflow Considerations

Comme mentionné précédemment, une ligne ne peut pas résider dans plusieurs pages et peut provoquer un dépassement si la taille combinée des champs de type de données de longueur variable dépasse la limite de 8 060 octets.As mentioned earlier, a row cannot reside on multiple pages and can overflow if the combined size of variable-length data-type fields exceeds the 8060-byte limit. À titre d’illustration, une table peut être créée avec deux colonnes : une colonne varchar (7000) et une autre colonne varchar (2000).To illustrate, a table may be created with two columns: one varchar(7000) and another varchar (2000). Individuellement, aucune colonne ne dépasse 8 060 octets, mais combinées, elles peuvent le faire si la largeur totale de chaque colonne est remplie.Individually neither column exceeds the 8060-byte, but combined they could do so, if the entire width of each column is filled. SQL Server peut déplacer dynamiquement la colonne de longueur variable varchar(7000) vers des pages de l’unité d’allocation ROW_OVERFLOW_DATA.SQL Server may dynamically move the varchar(7000) variable length column to pages in the ROW_OVERFLOW_DATA allocation unit. Quand vous combinez des colonnes de type varchar, nvarchar, varbinary, sql_variant ou CLR défini par l’utilisateur qui dépassent 8 060 octets par ligne, tenez compte des points suivants :When you combine varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns that exceed 8,060 bytes per row, consider the following:

  • Les enregistrements volumineux sont automatiquement déplacés vers une autre page dès lors que les enregistrements s'allongent suite à une opération de mise à jour.Moving large records to another page occurs dynamically as records are lengthened based on update operations. Les opérations de mise à jour qui raccourcissent les enregistrements peuvent provoquer le rapatriement d'enregistrements vers la page initiale dans l'unité d'allocation IN_ROW_DATA.Update operations that shorten records may cause records to be moved back to the original page in the IN_ROW_DATA allocation unit. L’interrogation et d’autres opérations de sélection, telles que les tris ou les jointures portant sur des enregistrements volumineux qui contiennent des données de dépassement de ligne, augmentent le temps de traitement car ces enregistrements sont traités de façon synchrone, et non de manière asynchrone.Querying and performing other select operations, such as sorts or joins on large records that contain row-overflow data slows processing time, because these records are processed synchronously instead of asynchronously.
    Par conséquent, quand vous concevez une table comportant plusieurs colonnes de type varchar, nvarchar, varbinary, sql_variant ou CLR défini par l’utilisateur, évaluez le pourcentage de lignes susceptibles de dépasser et la fréquence à laquelle ces données de dépassement sont susceptibles d’être interrogées.Therefore, when you design a table with multiple varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns, consider the percentage of rows that are likely to flow over and the frequency with which this overflow data is likely to be queried. S'il est probable qu'il y ait de fréquentes requêtes sur de nombreuses lignes de données de dépassement de ligne, pensez à normaliser la table de manière à ce que certaines colonnes soient déplacées vers une autre table.If there are likely to be frequent queries on many rows of row-overflow data, consider normalizing the table so that some columns are moved to another table. Celle-ci peut ensuite être interrogée lors d'une opération JOIN asynchrone.This can then be queried in an asynchronous JOIN operation.
  • La longueur des différentes colonnes ne doit pas dépasser la limite de 8 000 octets par colonne de type varchar, nvarchar, varbinary, sql_variant et CLR défini par l’utilisateur.The length of individual columns must still fall within the limit of 8,000 bytes for varchar, nvarchar, varbinary, sql_variant, and CLR user-defined type columns. Seule la combinaison de leurs longueurs peut dépasser la limite de 8 060 octets par ligne d'une table.Only their combined lengths can exceed the 8,060-byte row limit of a table.
  • La somme des longueurs des colonnes d’autres types de données, notamment char et nchar, ne doit pas dépasser la limite de 8 060 octets par ligne.The sum of other data type columns, including char and nchar data, must fall within the 8,060-byte row limit. En outre, les données d'objet volumineux ne sont pas soumises à la limite de 8 060 octets par ligne.Large object data is also exempt from the 8,060-byte row limit.
  • La clé d’un index cluster ne peut pas contenir de colonnes varchar qui possèdent des données dans l’unité d’allocation ROW_OVERFLOW_DATA.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. Si un index cluster est créé sur une colonne varchar et que les données existantes se trouvent dans l’unité d’allocation IN_ROW_DATA, les actions d’insertion ou de mise à jour réalisées ultérieurement sur la colonne et susceptibles d’envoyer les données hors ligne sont vouées à l’échec.If a clustered index is created on a varchar column and the existing data is in the IN_ROW_DATA allocation unit, subsequent insert or update actions on the column that would push the data off-row will fail. Pour plus d’informations sur les unités d’allocation, consultez Organisation des tables et des index.For more information about allocation units, see Table and Index Organization.
  • Vous pouvez inclure des colonnes qui contiennent des données de dépassement de ligne en tant que colonnes clés ou non clés d'un index non-cluster.You can include columns that contain row-overflow data as key or nonkey columns of a nonclustered index.
  • La limite de taille d'enregistrement pour les tables qui utilisent des colonnes éparses est de 8 018 octets.The record-size limit for tables that use sparse columns is 8,018 bytes. Quand les données converties plus les données de l’enregistrement existant dépassent 8 018 octets, MSSQLSERVER ERROR 576 est retourné.When the converted data plus existing record data exceeds 8,018 bytes, MSSQLSERVER ERROR 576 is returned. Quand des colonnes sont converties entre les types éparse et non éparse, le moteur de base de données garde une copie des données de l’enregistrement actif.When columns are converted between sparse and nonsparse types, Database Engine keeps a copy of the current record data. Cela double temporairement le stockage requis pour l'enregistrement.This temporarily doubles the storage that is required for the record.
  • Pour obtenir des informations sur les tables ou les index pouvant contenir des données de dépassement de ligne, utilisez la fonction de gestion dynamique sys.dm_db_index_physical_stats.To obtain information about tables or indexes that might contain row-overflow data, use the sys.dm_db_index_physical_stats dynamic management function.

ÉtenduesExtents

Les extensions constituent l'unité de base dans laquelle l'espace est géré.Extents are the basic unit in which space is managed. Une extension est constituée de 8 pages contiguës, soit 64 Ko.An extent is eight physically contiguous pages, or 64 KB. Autrement dit, les bases de données SQL Server disposent de 16 étendues par mégaoctet.This means SQL Server databases have 16 extents per megabyte.

SQL ServerSQL Server contient deux types d’étendues :has two types of extents:

  • Les extensions uniformes appartiennent à un objet unique ; les huit pages de l’extension ne peuvent être utilisées que par l’objet propriétaire.Uniform extents are owned by a single object; all eight pages in the extent can only be used by the owning object.
  • Les extensions mixtes sont partagées par huit objets au plus.Mixed extents are shared by up to eight objects. Chacune des huit pages de l'extension peut être la propriété d'un objet différent.Each of the eight pages in the extent can be owned by a different object.

Jusqu’à SQL Server 2014 (12.x)SQL Server 2014 (12.x) compris, SQL ServerSQL Server n’affecte pas d’étendues complètes aux tables possédant de petites quantités de données.Up to, and including, SQL Server 2014 (12.x)SQL Server 2014 (12.x), SQL ServerSQL Server does not allocate whole extents to tables with small amounts of data. Une nouvelle table ou un nouvel index affecte en général des pages issues d'extensions mixtes.A new table or index generally allocates pages from mixed extents. Lorsque la table ou l'index atteint huit pages, il bascule à l'utilisation des extensions uniformes pour les allocations suivantes.When the table or index grows to the point that it has eight pages, it then switches to use uniform extents for subsequent allocations. 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.If you create an index on an existing table that has enough rows to generate eight pages in the index, all allocations to the index are in uniform extents. Toutefois, à partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x), l’option par défaut pour toutes les allocations dans la base de données correspond aux extensions uniformes.However, starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the default for all allocations in the database is uniform extents.

Étendues

Notes

Jusqu'à SQL Server 2014 (12.x)SQL Server 2014 (12.x) compris, l’indicateur de trace 1118 peut être utilisé pour modifier l’allocation par défaut afin de toujours utiliser des extensions uniformes.Up to, and including, SQL Server 2014 (12.x)SQL Server 2014 (12.x), trace flag 1118 can be used to change the default allocation to always use uniform extents. Pour plus d’informations sur cet indicateur de trace, consultez DBCC TRACEON - Indicateurs de Trace.For more information about this trace flag, see DBCC TRACEON - Trace Flags.

À partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x), la fonctionnalité fournie par l’indicateur de trace 1118 est automatiquement activée pour TempDB.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the functionality provided by TF 1118 is automatically enabled for TempDB. Pour les bases de données utilisateur, ce comportement est contrôlé par l’option SET MIXED_PAGE_ALLOCATION de ALTER DATABASE, avec la valeur par défaut définie sur OFF, et l’indicateur de trace 1118 n’a aucun effet.For user databases, this behavior is controlled by the SET MIXED_PAGE_ALLOCATION option of ALTER DATABASE, with the default value set to OFF, and trace flag 1118 has no effect. Pour plus d’informations, consultez Options SET d’ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE SET Options (Transact-SQL).

Gestion des allocations des extensions et de l'espace libreManaging Extent Allocations and Free Space

Les structures de données SQL ServerSQL Server qui gèrent les allocations des extensions et l’espace libre ont une structure relativement simple.The SQL ServerSQL Server data structures that manage extent allocations and track free space have a relatively simple structure. Cette solution offre les avantages suivants :This has the following benefits:

  • Les informations sur l'espace libre sont très compactes, d'où un nombre de pages d'informations relativement faible.The free space information is densely packed, so relatively few pages contain this information.
    La vitesse s'en trouve augmentée grâce à la réduction du nombre de lectures sur le disque nécessaires à la récupération des informations d'allocationThis increases speed by reducing the amount of disk reads that are required to retrieve allocation information. et à l'augmentation de la possibilité de garder en mémoire l'affectation des pages, ce qui réduit encore le nombre de lectures.This also increases the chance that the allocation pages will remain in memory and not require more reads.

  • La plupart des informations d'allocation ne sont pas enchaînées les unes aux autres,Most of the allocation information is not chained together. ce qui simplifie leur gestion.This simplifies the maintenance of the allocation information.
    Chaque allocation ou désallocation de page peut être effectuée rapidement,Each page allocation or deallocation can be performed quickly. ce qui diminue les problèmes de contention entre les tâches simultanées nécessitant une allocation ou une désallocation de pages.This decreases the contention between concurrent tasks having to allocate or deallocate pages.

Gestion des allocations des extensionsManaging Extent Allocations

SQL ServerSQL Server utilise deux types de tables d’allocation pour enregistrer l’allocation des extensions :uses two types of allocation maps to record the allocation of extents:

  • Pages GAM (Global Allocation Map) Global Allocation Map (GAM)
    Les pages GAM enregistrent les extensions qui ont été allouées.GAM pages record what extents have been allocated. Chaque page GAM couvre 64 000 extensions, soit près de 4 gigaoctets (Go) de données.Each GAM covers 64,000 extents, or almost 4 gigabytes (GB) of data. La page GAM compte un bit pour chaque extension dans l'intervalle couvert.The GAM has 1-bit for each extent in the interval it covers. Si la valeur du bit est 1, l'extension est libre. En revanche, si sa valeur est 0, l'extension est allouée.If the bit is 1, the extent is free; if the bit is 0, the extent is allocated.

  • Pages SGAM (Shared Global Allocation Map) Shared Global Allocation Map (SGAM)
    Les pages SGAM enregistrent les extensions actuellement utilisées comme extensions mixtes et possédant au moins une page inutilisée.SGAM pages record which extents are currently being used as mixed extents and also have at least one unused page. Chaque page SGAM couvre 64 000 étendues, soit près de 4 Go de données.Each SGAM covers 64,000 extents, or almost 4-GB of data. La page SGAM compte un bit pour chaque extension dans l'intervalle couvert.The SGAM has 1-bit for each extent in the interval it covers. Si la valeur du bit est 1, l'extension est utilisée comme extension mixte et possède une page libre.If the bit is 1, the extent is being used as a mixed extent and has a free page. Si la valeur du bit est 0, l'extension n'est pas utilisée comme extension mixte ou correspond à une extension mixte dont toutes les pages sont utilisées.If the bit is 0, the extent is not used as a mixed extent, or it is a mixed extent and all its pages are being used.

Chaque extension possède les schémas de bits suivants dans les tables GAM et SGAM, en fonction de son utilisation actuelle.Each extent has the following bit patterns set in the GAM and SGAM, based on its current use.

Utilisation actuelle de l'extensionCurrent use of extent Valeur du bit GAMGAM bit setting Valeur du bit SGAMSGAM bit setting
Libre, inutiliséeFree, not being used 11 00
Extension uniforme ou extension mixte complèteUniform extent, or full mixed extent 00 00
Extension mixte avec pages libresMixed extent with free pages 00 11

Ceci se traduit par des algorithmes simples de gestion des extensions.This causes simple extent management algorithms.

  • Pour allouer une extension uniforme, le Moteur de base de données SQL ServerSQL Server Database Engine recherche un bit 1 dans la table GAM et lui affecte la valeur 0.To allocate a uniform extent, the Moteur de base de données SQL ServerSQL Server Database Engine searches the GAM for a 1 bit and sets it to 0.
  • Pour trouver une extension mixte comportant des pages libres, le Moteur de base de données SQL ServerSQL Server Database Engine recherche un bit 1 dans la table SGAM.To find a mixed extent with free pages, the Moteur de base de données SQL ServerSQL Server Database Engine searches the SGAM for a 1 bit.
  • Pour allouer une extension mixte, le Moteur de base de données SQL ServerSQL Server Database Engine recherche un bit 1 dans la table GAM, lui affecte la valeur 0, puis affecte la valeur 1 au bit correspondant dans la table SGAM.To allocate a mixed extent, the Moteur de base de données SQL ServerSQL Server Database Engine searches the GAM for a 1 bit, sets it to 0, and then also sets the corresponding bit in the SGAM to 1.
  • Pour désallouer une extension, le Moteur de base de données SQL ServerSQL Server Database Engine s’assure que le bit de la table GAM a la valeur 1 et que le bit de la table SGAM a la valeur 0.To deallocate an extent, the Moteur de base de données SQL ServerSQL Server Database Engine makes sure that the GAM bit is set to 1 and the SGAM bit is set to 0. Les algorithmes qui sont effectivement utilisés en interne par le Moteur de base de données SQL ServerSQL Server Database Engine sont plus complexes que ceux décrits dans cet article, du fait que le Moteur de base de données SQL ServerSQL Server Database Engine répartit les données uniformément dans une base de données.The algorithms that are actually used internally by the Moteur de base de données SQL ServerSQL Server Database Engine are more sophisticated than what is described in this article, because the Moteur de base de données SQL ServerSQL Server Database Engine distributes data evenly in a database. Toutefois, même les algorithmes réels sont simplifiés afin de ne plus devoir gérer les chaînes d'informations d'allocation des extensions.However, even the real algorithms are simplified by not having to manage chains of extent allocation information.

Suivi de l’espace libreTracking free space

Les pages PFS (Page Free Space) enregistrent quand une page individuelle a été allouée, le statut d’allocation et la quantité d’espace libre de chaque page.Page Free Space (PFS) pages record the allocation status of each page, whether an individual page has been allocated, and the amount of free space on each page. Chaque page correspond à un octet qui enregistre si la page a été allouée et, le cas échéant, si elle est vide, pleine à 1-50 %, 51-80 %, 81-95 % ou 96-100 %.The PFS has 1-byte for each page, recording whether the page is allocated, and if so, whether it is empty, 1 to 50 percent full, 51 to 80 percent full, 81 to 95 percent full, or 96 to 100 percent full.

Une fois une extension allouée à un objet, le Moteur de base de données SQL ServerSQL Server Database Engine utilise les pages PFS pour enregistrer les pages de l'extension qui sont allouées ou libres.After an extent has been allocated to an object, the Moteur de base de données SQL ServerSQL Server Database Engine uses the PFS pages to record which pages in the extent are allocated or free. Ces informations sont alors utilisées par le Moteur de base de données SQL ServerSQL Server Database Engine pour l'allocation de toute nouvelle page.This information is used when the Moteur de base de données SQL ServerSQL Server Database Engine has to allocate a new page. La quantité d'espace libre d'une page n'est conservée que pour les pages de segment, de texte et d'image.The amount of free space in a page is only maintained for heap and Text/Image pages. Ces informations sont exploitées par le Moteur de base de données SQL ServerSQL Server Database Engine pour rechercher une page disposant de suffisamment d'espace libre pour accueillir une nouvelle ligne.It is used when the Moteur de base de données SQL ServerSQL Server Database Engine has to find a page with free space available to hold a newly inserted row. Pour les index, le suivi de l'espace libre des pages n'est pas nécessaire étant donné que le point d'insertion d'une nouvelle ligne est défini par les valeurs de clés de l'index.Indexes do not require that the page free space be tracked, because the point at which to insert a new row is set by the index key values.

Une nouvelle page PFS, GAM ou SGAM est ajoutée au fichier de données pour chaque plage supplémentaire dont elle effectue le suivi.A new PFS, GAM or SGAM page is added in the data file for every additional range that it keeps track of. Ainsi, il y a une nouvelle page PFS 8 088 pages après la première page PFS, et des pages PFS supplémentaires toutes les 8 088 pages.Thus, there is a new PFS page 8,088 pages after the first PFS page, and additional PFS pages in subsequent 8,088 page intervals. À titre d’illustration, l’ID de page 1 est une page PFS, l’ID de page 8088 est une page PFS, l’ID de page 16176 est une page PFS, et ainsi de suite.To illustrate, page ID 1 is a PFS page, page ID 8088 is a PFS page, page ID 16176 is a PFS page, and so on. Il y a une nouvelle page GAM 64 000 étendues après la première page GAM, qui effectue le suivi des 64 000 étendues qui la suivent. La séquence continue toutes les 64 000 étendues.There is a new GAM page 64,000 extents after the first GAM page and it keeps track of the 64,000-extents following it; the sequence continues at 64,000-extent intervals. De même, il y a une nouvelle page SGAM 64 000 étendues après la première page SGAM et des pages SGAM supplémentaires toutes les 64 000 étendues.Similarly, there is a new SGAM page 64,000 extents after the first SGAM page and additional SGAM pages in subsequent 64,000 extent intervals. L’illustration suivante indique l’ordre des pages utilisées par le Moteur de base de données SQL ServerSQL Server Database Engine pour l’allocation et la gestion des extensions.The following illustration shows the sequence of pages used by the Moteur de base de données SQL ServerSQL Server Database Engine to allocate and manage extents.

manage_extents

Gestion de l’espace utilisé par les objetsManaging space used by objects

Une page IAM (Index Allocation Map) mappe les étendues d’une portion de 4 Go d’un fichier de base de données utilisées par une unité d’allocation.An Index Allocation Map (IAM) page maps the extents in a 4-GB part of a database file used by an allocation unit. Une unité d'allocation peut être de trois types :An allocation unit is one of three types:

  • IN_ROW_DATAIN_ROW_DATA
    Contient une partition d'un segment ou d'un index.Holds a partition of a heap or index.

  • LOB_DATALOB_DATA
    Contient des types de données d’objets volumineux (LOB), tels que xml, varbinary(max) et varchar(max).Holds large object (LOB) data types, such as xml, varbinary(max), and varchar(max).

  • ROW_OVERFLOW_DATAROW_OVERFLOW_DATA
    Contient des données de longueur variable stockées dans des colonnes varchar, nvarchar, varbinary ou sql_variant qui dépassent le seuil de 8 060 octets par ligne.Holds variable length data stored in varchar, nvarchar, varbinary, or sql_variant columns that exceed the 8,060 byte row size limit.

Chaque partition d'un segment ou d'un index contient au moins une unité d'allocation IN_ROW_DATA.Each partition of a heap or index contains at least an IN_ROW_DATA allocation unit. Elle peut aussi contenir une unité d'allocation LOB_DATA ou ROW_OVERFLOW_DATA, selon le schéma de segment ou d'index.It may also contain a LOB_DATA or ROW_OVERFLOW_DATA allocation unit, depending on the heap or index schema.

Une page IAM couvre une plage de 4 Go dans un fichier, comme une page GAM ou SGAM.An IAM page covers a 4-GB range in a file and is the same coverage as a GAM or SGAM page. Si l'unité d'allocation contient des étendues provenant de plusieurs fichiers, ou plusieurs plages de 4 Go dans un fichier, il y aura plusieurs pages IAM liées entre elles dans une chaîne IAM.If the allocation unit contains extents from more than one file, or more than one 4-GB range of a file, there will be multiple IAM pages linked in an IAM chain. Ainsi, chaque unité d'allocation contient au moins une page IAM pour chaque fichier dans lequel elle possède des étendues.Therefore, each allocation unit has at least one IAM page for each file on which it has extents. Un fichier peut aussi contenir plusieurs pages IAM si la plage d'étendues du fichier allouée à l'unité d'allocation dépasse la plage que peut enregistrer une page IAM unique.There may also be more than one IAM page on a file, if the range of the extents on the file allocated to the allocation unit exceeds the range that a single IAM page can record.

iam_pages

Les pages IAM sont allouées au fur et à mesure des besoins pour chaque unité d'allocation et elles sont placées aléatoirement dans le fichier.IAM pages are allocated as required for each allocation unit and are located randomly in the file. La vue système, sys.system_internals_allocation_units, pointe sur la première page IAM d’une unité d’allocation.The system view, sys.system_internals_allocation_units, points to the first IAM page for an allocation unit. Toutes les pages IAM de cette unité d'allocation sont liées entre elles et forment une chaîne.All the IAM pages for that allocation unit are linked in a chain.

Important

La vue système sys.system_internals_allocation_units est destinée exclusivement à un usage interne et elle est susceptible de changer.The sys.system_internals_allocation_units system view is for internal use only and is subject to change. La compatibilité n'est pas garantie.Compatibility is not guaranteed.

iam_chain

Pages IAM liées dans une chaîne par unité d’allocation. Une page IAM possède un en-tête indiquant l’étendue de départ de la plage d’étendues mappée par la page IAM.IAM pages linked in a chain per allocation unit An IAM page has a header that indicates the starting extent of the range of extents mapped by the IAM page. La page IAM contient aussi une grande image dans laquelle chaque bit représente une étendue.The IAM page also has a large bitmap in which each bit represents one extent. Le premier bit représente la première étendue de la plage, le second la deuxième étendue, et ainsi de suite.The first bit in the map represents the first extent in the range, the second bit represents the second extent, and so on. Si un bit est égal à 0, l'étendue qu'il représente n'est pas allouée à l'unité d'allocation possédant la page IAM.If a bit is 0, the extent it represents is not allocated to the allocation unit owning the IAM. Si un bit est égal à 1, l'étendue qu'il représente est allouée à l'unité d'allocation possédant la page IAM.If the bit is 1, the extent it represents is allocated to the allocation unit owning the IAM page.

Quand le Moteur de base de données SQL ServerSQL Server Database Engine a besoin d’insérer une nouvelle ligne et qu’il n’y a pas de place sur la page active, il a recours aux pages IAM et PFS pour rechercher une page à allouer ou, pour un segment ou une page de texte/image, une page suffisamment grande pour accueillir la ligne.When the Moteur de base de données SQL ServerSQL Server Database Engine has to insert a new row and no space is available in the current page, it uses the IAM and PFS pages to find a page to allocate, or, for a heap or a Text/Image page, a page with sufficient space to hold the row. Le Moteur de base de données SQL ServerSQL Server Database Engine utilise les pages IAM pour rechercher les étendues allouées à l’unité d’allocation.The Moteur de base de données SQL ServerSQL Server Database Engine uses the IAM pages to find the extents allocated to the allocation unit. Pour chaque étendue, le Moteur de base de données SQL ServerSQL Server Database Engine recherche les pages PFS afin de vérifier si l’une d’elles peut être utilisée.For each extent, the Moteur de base de données SQL ServerSQL Server Database Engine searches the PFS pages to see if there is a page that can be used. Chaque page IAM et PFS couvre de nombreuses pages de données de sorte qu'il y a peu de pages IAM et PFS dans une base de données.Each IAM and PFS page covers lots of data pages, so there are few IAM and PFS pages in a database. C'est pourquoi elles se trouvent en général dans la mémoire du pool de mémoires tampons de SQL ServerSQL Server, d'où il est possible de les rechercher plus rapidement.This means that the IAM and PFS pages are generally in memory in the SQL ServerSQL Server buffer pool, so they can be searched quickly. Pour les index, le point d’insertion d’une nouvelle ligne est défini par la clé d’index, mais quand une nouvelle page est nécessaire, le processus décrite précédemment se produit.For indexes, the insertion point of a new row is set by the index key, but when a new page is needed, the previously described process occurs.

Le Moteur de base de données SQL ServerSQL Server Database Engine n’alloue une nouvelle étendue à une unité d’allocation que s’il ne trouve pas rapidement une page suffisamment grande dans une étendue existante pour accueillir la ligne à insérer.The Moteur de base de données SQL ServerSQL Server Database Engine allocates a new extent to an allocation unit only when it cannot quickly find a page in an existing extent with sufficient space to hold the row being inserted.

Le Moteur de base de données SQL ServerSQL Server Database Engine alloue des étendues à partir de celles qui sont disponibles dans le groupe de fichiers à l’aide d’un algorithme d’allocation de remplissage proportionnel.The Moteur de base de données SQL ServerSQL Server Database Engine allocates extents from those available in the filegroup using a proportional fill allocation algorithm. Si, dans un même groupe de fichiers composé de deux fichiers, l’un d’entre eux dispose de deux fois plus d’espace disponible que l’autre, deux pages sont allouées à partir du fichier ayant le plus d’espace disponible pour chacune des pages allouées à partir de l’autre fichier.If in the same filegroup with two files, one file has two times the free space as the other, two pages will be allocated from the file with the available space for every one page allocated from the other file. Cela signifie que chaque fichier d'un groupe doit avoir un pourcentage identique d'espace utilisé.This means that every file in a filegroup should have a similar percentage of space used.

Suivi des extensions modifiéesTracking Modified Extents

SQL ServerSQL Server utilise deux structures de données internes pour suivre les extensions modifiées par les opérations de copie en bloc et les extensions modifiées depuis la dernière sauvegarde complète.uses two internal data structures to track extents modified by bulk copy operations and extents modified since the last full backup. Ces structures de données accélèrent considérablement les sauvegardes différentielles.These data structures greatly speed up differential backups. Elles accélèrent également l'enregistrement des opérations de copie en bloc dans le journal lorsqu'une base de données utilise le mode de récupération utilisant les journaux de transactions.They also speed up the logging of bulk copy operations when a database is using the bulk-logged recovery model. À l'instar des pages GAM (Global Allocation Map) et SGAM (Shared Global Allocation Map), ces structures sont des bitmaps où chaque bit représente une extension unique.Like the Global Allocation Map (GAM) and Shared Global Allocation Map (SGAM) pages, these structures are bitmaps in which each bit represents a single extent.

  • DCM (Differential Changed Map) Differential Changed Map (DCM)
    Ces pages suivent les extensions qui ont été modifiées depuis la dernière instruction BACKUP DATABASE.This tracks the extents that have changed since the last BACKUP DATABASE statement. Si le bit d’une extension est à 1, l’extension a été modifiée depuis la dernière instruction BACKUP DATABASE.If the bit for an extent is 1, the extent has been modified since the last BACKUP DATABASE statement. Si le bit est à 0, l'extension n'a pas été modifiée.If the bit is 0, the extent has not been modified. Les sauvegardes différentielles lisent uniquement les pages DCM pour déterminer les extensions qui ont été modifiées.Differential backups read just the DCM pages to determine which extents have been modified. Cela réduit considérablement le nombre de pages qu'une sauvegarde différentielle doit analyser.This greatly reduces the number of pages that a differential backup must scan. La durée d'exécution d'une sauvegarde différentielle est proportionnelle au nombre d'extensions modifiées depuis la dernière instruction BACKUP DATABASE, et non à la taille globale de la base de données.The length of time that a differential backup runs is proportional to the number of extents modified since the last BACKUP DATABASE statement and not the overall size of the database.

  • BCM (Bulk Changed Map) Bulk Changed Map (BCM)
    Ces pages suivent les extensions qui ont été modifiées par des opérations journalisées en bloc depuis la dernière instruction BACKUP LOG.This tracks the extents that have been modified by bulk logged operations since the last BACKUP LOG statement. Si le bit d’une extension est à 1, l’extension a été modifiée par une opération journalisée en bloc après la dernière instruction BACKUP LOG.If the bit for an extent is 1, the extent has been modified by a bulk logged operation after the last BACKUP LOG statement. Si le bit est à 0, l'extension n'a pas été modifiée par les opérations journalisées en bloc.If the bit is 0, the extent has not been modified by bulk logged operations. Bien que les pages BCM existent dans toutes les bases de données, elles sont uniquement significatives lorsque la base de données emploie le mode de récupération utilisant les journaux de transactions.Although BCM pages appear in all databases, they are only relevant when the database is using the bulk-logged recovery model. Dans ce mode de récupération, quand une procédure BACKUP LOG est effectuée, le processus de sauvegarde analyse les pages BCM pour identifier les extensions qui ont été modifiées.In this recovery model, when a BACKUP LOG is performed, the backup process scans the BCMs for extents that have been modified. Il inclut ensuite ces extensions dans la sauvegarde du journal.It then includes those extents in the log backup. Ceci permet de récupérer les opérations journalisées en bloc si la base de données est restaurée à partir d'une sauvegarde de la base de données et d'une séquence de sauvegardes de journaux de transactions.This lets the bulk logged operations be recovered if the database is restored from a database backup and a sequence of transaction log backups. Les pages BCM ne sont pas significatives dans une base de données qui utilise le mode de récupération simple, car aucune opération journalisée en bloc n'est enregistrée dans le journal.BCM pages are not relevant in a database that is using the simple recovery model, because no bulk logged operations are logged. Elles ne sont pas significatives dans une base de données utilisant le mode de récupération complet puisque ce dernier traite les opérations journalisées en bloc comme des opérations entièrement enregistrées dans le journal.They are not relevant in a database that is using the full recovery model, because that recovery model treats bulk logged operations as fully logged operations.

L'intervalle entre les pages DCM et les pages BCM est le même que l'intervalle entre les pages GAM et SGAM : 64 000 extensions.The interval between DCM pages and BCM pages is the same as the interval between GAM and SGAM page, 64,000 extents. Les pages DCM et BCM sont situées juste derrière les pages GAM et SGAM dans un fichier physique :The DCM and BCM pages are located behind the GAM and SGAM pages in a physical file:

special_page_order

Voir aussiSee Also

sys.allocation_units (Transact-SQL) sys.allocation_units (Transact-SQL)
Segments (tables sans index cluster) Heaps (Tables without Clustered Indexes)
Lecture de pages Reading Pages
Écritures de pagesWriting Pages