Guía de arquitectura de páginas y extensionesPages and Extents Architecture Guide

Se aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database SíInstancia administrada de Azure SQLAzure SQL Managed InstanceYesInstancia administrada de Azure SQLAzure SQL Managed Instance síAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics síAlmacenamiento de datos paralelosParallel Data WarehouseyesAlmacenamiento de datos paralelosParallel Data WarehouseSe aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database SíInstancia administrada de Azure SQLAzure SQL Managed InstanceYesInstancia administrada de Azure SQLAzure SQL Managed Instance síAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics síAlmacenamiento de datos paralelosParallel Data WarehouseyesAlmacenamiento de datos paralelosParallel Data Warehouse

La página es la unidad fundamental del almacenamiento de datos en SQL ServerSQL Server.The page is the fundamental unit of data storage in SQL ServerSQL Server. Una extensión es una colección de ocho páginas físicamente contiguas.An extent is a collection of eight physically contiguous pages. Las extensiones ayudan a administrar las páginas con eficacia.Extents help efficiently manage pages. En esta guía se describen las estructuras de datos que se utilizan para administrar páginas y extensiones en todas las versiones de SQL Server.This guide describes the data structures that are used to manage pages and extents in all versions of SQL Server. Comprender la arquitectura de las páginas y las extensiones es importante para diseñar y desarrollar bases de datos que funcionen eficazmente.Understanding the architecture of pages and extents is important for designing and developing databases that perform efficiently.

Páginas y extensionesPages and Extents

La unidad fundamental del almacenamiento de datos en SQL ServerSQL Server es la página.The fundamental unit of data storage in SQL ServerSQL Server is the page. El espacio en disco asignado a un archivo de datos (.mdf o .ndf) en una base de datos se divide lógicamente en páginas numeradas de forma contigua de 0 a 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. Las operaciones de E/S de disco se realizan en el nivel de página.Disk I/O operations are performed at the page level. Es decir, SQL Server lee o escribe páginas de datos enteras.That is, SQL Server reads or writes whole data pages.

Las extensiones son una colección de ocho páginas físicamente contiguas; se utilizan para administrar las páginas de forma eficaz.Extents are a collection of eight physically contiguous pages and are used to efficiently manage the pages. Todas las páginas se organizan en extensiones.All pages are organized into extents.

PáginasPages

Pongamos el ejemplo de un libro normal: todo su contenido está escrito en las páginas.Take a regular book: all content in it is written on pages. De forma similar a un libro, en SQL Server todas las filas de datos están escritas en las páginas.Similar to a book, in SQL Server all the data rows are written on pages. En un libro, todas las páginas tienen el mismo tamaño físico.In a book, all pages are the same physical size. Del mismo modo, en SQL Server todas las páginas de datos tienen el mismo tamaño: 8 kilobytes.Similarly, in SQL Server all data pages are the same size - 8 kilobytes. En un libro, la mayoría de las páginas contienen los datos (el contenido principal del libro) y algunas páginas contienen metadatos sobre el contenido (por ejemplo, tabla de contenido e índice).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. De nuevo, SQL Server no es distinto: la mayoría de las páginas contienen filas de datos reales almacenadas por los usuarios. Se denominan páginas de datos y páginas de texto e imagen (para casos especiales).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). Las páginas de índice contienen referencias de índice sobre dónde están los datos y, por último, hay páginas del sistema que almacenan varios metadatos sobre la organización de los datos (páginas PFS, GAM, SGAM, IAM, DCM y BCM).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). Consulte la tabla siguiente para ver los tipos de página y su descripción.See table below for page types and their description.

Tal como se ha mencionado, en SQL ServerSQL Server, el tamaño de página es de 8 KB.As mentioned, in SQL ServerSQL Server, the page size is 8-KB. Esto significa que las bases de datos de SQL ServerSQL Server tienen 128 páginas por megabyte.This means SQL ServerSQL Server databases have 128 pages per megabyte. Cada página empieza con un encabezado de 96 bytes, que se utiliza para almacenar la información del sistema acerca de la página.Each page begins with a 96-byte header that is used to store system information about the page. Esta información incluye el número de página, el tipo de página, el espacio disponible en la página y el Id. de unidad de asignación del objeto propietario de la página.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.

En la siguiente tabla se muestran los tipos de página utilizados en los archivos de datos de una base de datos de SQL ServerSQL Server.The following table shows the page types used in the data files of a SQL ServerSQL Server database.

Tipo de páginaPage type ContenidoContents
dataData Filas de datos con todos los datos, excepto los datos de text, ntext, image, nvarchar(max), varchar(max), varbinary(max) y xml, cuando el texto de la fila está configurado en 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.
ÍndiceIndex Entradas de índice.Index entries.
Texto o imagenText/Image Tipos de datos de objetos grandes: (datos de text, ntext, image, nvarchar(max), varchar(max), varbinary(max) y xml)Large object data types: (text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data)
Columnas de longitud variable cuando la fila de datos supera los 8 KB: (varchar, nvarchar, varbinary y sql_variant)Variable length columns when the data row exceeds 8 KB: (varchar, nvarchar, varbinary, and sql_variant)
Mapa de asignación global, Mapa de asignación global compartidoGlobal Allocation Map, Shared Global Allocation Map Información acerca de si se han asignado las extensiones.Information about whether extents are allocated.
Espacio disponible en páginas (PFS)Page Free Space (PFS) Información acerca de la asignación de páginas y el espacio disponible disponible en las páginas.Information about page allocation and free space available on pages.
Mapa de asignación de índicesIndex Allocation Map Información acerca de las extensiones utilizadas por una tabla o un índice por unidad de asignación.Information about extents used by a table or index per allocation unit.
mapa cambiado masivamenteBulk Changed Map Información acerca de las extensiones modificadas por operaciones masivas desde la última instrucción BACKUP LOG por unidad de asignación.Information about extents modified by bulk operations since the last BACKUP LOG statement per allocation unit.
Mapa cambiado diferencialDifferential Changed Map Información acerca de las extensiones que han cambiado desde la última instrucción BACKUP DATABASE por unidad de asignación.Information about extents that have changed since the last BACKUP DATABASE statement per allocation unit.

Nota

Los archivos de registro no contienen páginas, contienen series de registros.Log files do not contain pages; they contain a series of log records.

Las filas de datos se colocan en las páginas una a continuación de otra, empezando inmediatamente después del encabezado.Data rows are put on the page serially, starting immediately after the header. Al final de la página, comienza una tabla de desplazamiento de fila y cada una de esas tablas contiene una entrada para cada fila de la página.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. Cada entrada de desplazamiento de fila registra la distancia del primer byte de la fila desde el inicio de la página.Each row offset entry records how far the first byte of the row is from the start of the page. Por lo tanto, la función de la tabla de desplazamiento de filas es ayudar a SQL Server buscar filas en una página muy rápidamente.Thus, the function of the row offset table is to help SQL Server locate rows on a page very quickly. Las entradas de la tabla de desplazamiento de fila están en orden inverso a la secuencia de las filas de la página.The entries in the row offset table are in reverse sequence from the sequence of the rows on the page.

page_architecture

Compatibilidad con filas largasLarge Row Support

Las filas no pueden abarcar páginas; no obstante, se pueden apartar de la página de la fila ciertas partes de la fila para que ésta pueda tener un tamaño mucho mayor.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 cantidad máxima de datos y de sobrecarga que está contenida en una única fila de una página es de 8060 bytes (8 KB).The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8-KB). Sin embargo, esto no incluye los datos almacenados en el tipo de página Texto o imagen.However, this does not include the data stored in the Text/Image page type.

Esta restricción es menos estricta para tablas que contienen columnas varchar, nvarchar, varbinary o sql_variant.This restriction is relaxed for tables that contain varchar, nvarchar, varbinary, or sql_variant columns. Cuando el tamaño de fila total de todas las columnas variables y fijas de una tabla excede el límite de 8060 bytes, SQL ServerSQL Server mueve dinámicamente una o más columnas de longitud variable a páginas de la unidad de asignación ROW_OVERFLOW_DATA, empezando por la columna con el mayor ancho.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.

Esto se realiza cuando una operación de inserción o actualización aumenta el tamaño total de la fila más allá del límite de 8060 bytes.This is done whenever an insert or update operation increases the total size of the row beyond the 8,060-byte limit. Cuando una columna se mueve a una página de la unidad de asignación ROW_OVERFLOW_DATA, se mantiene un puntero de 24 bytes de la página original de la unidad de asignación 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 una operación posterior reduce el tamaño de la fila ,SQL ServerSQL Server vuelve a mover las columnas dinámicamente a la página de datos original.If a subsequent operation reduces the row size, SQL ServerSQL Server dynamically moves the columns back to the original data page.

Consideraciones acerca del desbordamiento de filaRow-Overflow Considerations

Como se mencionó anteriormente, una fila no puede residir en varias páginas y puede desbordarse si el tamaño combinado de los campos de tipo de datos de longitud variable supera el límite de 8060 bytes.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. Para ilustrar esto, se puede crear una tabla con dos columnas: una varchar(7000) y otra varchar(2000).To illustrate, a table may be created with two columns: one varchar(7000) and another varchar (2000). De forma individual, ninguna de las columnas excede los 8060 bytes, pero si se combinan sí que podrían hacerlo, si se rellena todo el ancho de cada columna.Individually neither column exceeds the 8060-byte, but combined they could do so, if the entire width of each column is filled. SQL Server puede trasladar dinámicamente la columna de longitud variable varchar (7000) a las páginas de la unidad de asignación ROW_OVERFLOW_DATA.SQL Server may dynamically move the varchar(7000) variable length column to pages in the ROW_OVERFLOW_DATA allocation unit. Al combinar las columnas varchar, nvarchar, varbinary, sql_variant o de tipo definido por el usuario CLR que superen los 8060 bytes por fila, tenga en cuenta lo siguiente:When you combine varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns that exceed 8,060 bytes per row, consider the following:

  • El movimiento de registros grandes a otra página tiene lugar de forma dinámica a medida que la longitud de los registros aumenta en función de las operaciones de actualización.Moving large records to another page occurs dynamically as records are lengthened based on update operations. Las operaciones de actualización que reducen la longitud de los registros pueden hacer que los registros se vuelvan a colocar en la página original de la unidad de asignación 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. El hecho de consultar y realizar otras operaciones de selección, como puedan ser ordenaciones o combinaciones en registros grandes que contengan datos de desbordamiento de fila, ralentiza el tiempo de procesamiento, ya que estos registros se procesan sincrónicamente en lugar de asincrónicamente.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.
    Por lo tanto, al diseñar una tabla con varias columnas varchar, nvarchar, varbinary, sql_variant o de tipo definido por el usuario CLR, tenga en cuenta el porcentaje de filas que tienen posibilidades de desbordarse y la frecuencia con la que se consultarán estos datos de desbordamiento.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. Si es muy probable que se realicen consultas con frecuencia en muchas filas de los datos de desbordamiento de fila, considere la posibilidad de normalizar la tabla para que algunas columnas se muevan a otra tabla.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. Más adelante, puede realizar la consulta en una operación JOIN asincrónica.This can then be queried in an asynchronous JOIN operation.
  • La longitud de las columnas individuales debe estar comprendida en el límite de 8000 bytes para las columnas varchar, nvarchar, varbinary, sql_variant y de tipo definido por el usuario CLR.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. Solo la combinación de sus longitudes puede superar el límite de fila de 8.060 bytes de una tabla.Only their combined lengths can exceed the 8,060-byte row limit of a table.
  • La suma de otras columnas de tipos de datos, incluidos los datos char y nchar, debe estar comprendida en el límite de fila de 8060 bytes.The sum of other data type columns, including char and nchar data, must fall within the 8,060-byte row limit. Los datos de objeto grande no están sometidos al límite de fila de 8.060 bytes.Large object data is also exempt from the 8,060-byte row limit.
  • La clave de índice de un índice agrupado no puede contener columnas varchar con datos existentes en la unidad de asignación 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 se crea un índice agrupado en una columna varchar y los datos existentes están en la unidad de asignación IN_ROW_DATA, no se realizarán correctamente las siguientes acciones de inserción o actualización en la columna que intenten insertar los datos de manera no consecutiva.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. Para obtener más información acerca de las unidades de asignación, vea Organización de tablas e índices.For more information about allocation units, see Table and Index Organization.
  • Puede incluir columnas que contengan datos de desbordamiento de fila como columnas de clave o sin clave de un índice no clúster.You can include columns that contain row-overflow data as key or nonkey columns of a nonclustered index.
  • El tamaño máximo del registro para las tablas que usan columnas dispersas es de 8.018 bytes.The record-size limit for tables that use sparse columns is 8,018 bytes. Si los datos convertidos más los datos de registro existentes superan los 8018 bytes, se devolverá el error MSSQLSERVER ERROR 576.When the converted data plus existing record data exceeds 8,018 bytes, MSSQLSERVER ERROR 576 is returned. Si las columnas pasan de dispersas a no dispersas y viceversa, el Motor de base de datos mantendrá una copia de los datos del registro actuales.When columns are converted between sparse and nonsparse types, Database Engine keeps a copy of the current record data. Esto duplica temporalmente el almacenamiento necesario para el registro.This temporarily doubles the storage that is required for the record.
  • Para obtener más información sobre las tablas o los índices que pueden contener datos de desbordamiento de fila, use la función de administración dinámica 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.

ExtentsExtents

Las extensiones son la unidad básica en la que se administra el espacio.Extents are the basic unit in which space is managed. Una extensión consta de ocho páginas contiguas físicamente, es decir 64 KB.An extent is eight physically contiguous pages, or 64 KB. Esto significa que las bases de datos de SQL Server tienen 16 extensiones por megabyte.This means SQL Server databases have 16 extents per megabyte.

SQL ServerSQL Server tiene dos tipos de extensiones:has two types of extents:

  • Las extensiones uniformes son propiedad de un único objeto; solo el objeto propietario puede usar las ocho páginas de la extensión.Uniform extents are owned by a single object; all eight pages in the extent can only be used by the owning object.
  • Las extensiones mixtas, que pueden estar compartidas por hasta ocho objetos.Mixed extents are shared by up to eight objects. Cada una de las 8 páginas de la extensión puede ser propiedad de un objeto diferente.Each of the eight pages in the extent can be owned by a different object.

Extensiones uniformes y mixtas

Hasta SQL Server 2014 (12.x)SQL Server 2014 (12.x) (incluido), SQL ServerSQL Server no asigna extensiones completas a tablas con pequeñas cantidades de datos.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. A las tablas o índices nuevos se les suelen asignar páginas de extensiones mixtas.A new table or index generally allocates pages from mixed extents. Cuando la tabla o el índice crecen hasta el punto de ocupar ocho páginas, se pasan a extensiones uniformes para las posteriores asignaciones.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 crea un índice de una tabla existente que dispone de filas suficientes para generar ocho páginas en el índice, todas las asignaciones del índice están en extensiones 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.

A partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x), el valor predeterminado para la mayoría de asignaciones en una base de datos de usuario y tempdb es usar extensiones uniformes, salvo en el caso de las asignaciones que pertenezcan a las primeras ocho páginas de una cadena IAM.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the default for most allocations in a user database and tempdb is to use uniform extents, except for allocations belonging to the first eight pages of an IAM chain. Las asignaciones relativas a bases de datos modelo, master y msdb conservarán el comportamiento anterior.Allocations for master, msdb, and model databases still retain the previous behavior.

Nota

Hasta SQL Server 2014 (12.x)SQL Server 2014 (12.x) (incluido), puede usarse la marca de seguimiento 1118 para cambiar la asignación predeterminada para que siempre use extensiones 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. Para más información sobre esta marca de seguimiento, vea DBCC TRACEON: marcas de seguimiento (Transact-SQL).For more information about this trace flag, see DBCC TRACEON - Trace Flags.

A partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x), la función proporcionada por TF 1118 se habilita automáticamente para tempdb y para todas las bases de datos de usuario.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the functionality provided by TF 1118 is automatically enabled for tempdb and all user databases. Para las bases de datos de usuario, este comportamiento se controla mediante la opción SET MIXED_PAGE_ALLOCATION de ALTER DATABASE, con el valor predeterminado establecido en Desactivado, y la marca de seguimiento 1118 no tiene ningún efecto.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. Para más información, vea Opciones de ALTER DATABASE SET (Transact-SQL).For more information, see ALTER DATABASE SET Options (Transact-SQL).

A partir de SQL Server 2012 (11.x)SQL Server 2012 (11.x), la función del sistema sys.dm_db_database_page_allocations puede notificar información de asignación de páginas relativa a una base de datos, tabla, índice o partición.Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x), the sys.dm_db_database_page_allocations system function can report page allocation information for a database, table, index, and partition.

Importante

La función del sistema sys.dm_db_database_page_allocations no está documentada y está sujeta a cambios.The sys.dm_db_database_page_allocations system function is not documented and is subject to change. la compatibilidad no está garantizada.Compatibility is not guaranteed.

A partir de SQL Server 2019 (15.x)SQL Server 2019 (15.x), la función del sistema sys.dm_db_page_info está disponible y devuelve información sobre una página de una base de datos.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), the sys.dm_db_page_info system function is available and returns information about a page in a database. La función devuelve una fila que contiene la información del encabezado de la página, incluidos object_id, index_id y partition_id.The function returns one row that contains the header information from the page, including the object_id, index_id, and partition_id. Esta función reemplaza la necesidad de usar DBCC PAGE en la mayoría de los casos.This function replaces the need to use DBCC PAGE in most cases.

Administrar las asignaciones de extensiones y el espacio disponibleManaging Extent Allocations and Free Space

Las estructuras de datos de SQL ServerSQL Server que administran asignaciones de extensiones y realizan un seguimiento del espacio disponible tienen una estructura relativamente sencilla.The SQL ServerSQL Server data structures that manage extent allocations and track free space have a relatively simple structure. Esto tiene las siguientes ventajas:This has the following benefits:

  • La información del espacio libre está densamente empaquetada, de modo que esta información está contenida en relativamente pocas páginas.The free space information is densely packed, so relatively few pages contain this information.
    Esto aumenta la velocidad al reducir la cantidad de lecturas del disco necesarias para recuperar la información de asignación.This increases speed by reducing the amount of disk reads that are required to retrieve allocation information. También incrementa la posibilidad de que las páginas de asignación permanezcan en la memoria, lo que elimina aún más lecturas.This also increases the chance that the allocation pages will remain in memory and not require more reads.

  • La mayor parte de la información de asignación no está encadenada.Most of the allocation information is not chained together. Esto simplifica el mantenimiento de la información de asignación.This simplifies the maintenance of the allocation information.
    La asignación o cancelación de asignación de las páginas se puede hacer con más rapidez.Each page allocation or deallocation can be performed quickly. Esto reduce el conflicto entre las tareas simultáneas que necesiten asignar o cancelar la asignación de páginas.This decreases the contention between concurrent tasks having to allocate or deallocate pages.

Administrar las asignaciones de extensionesManaging Extent Allocations

SQL ServerSQL Server usa dos tipos de mapas de asignación para registrar la asignación de las extensiones:uses two types of allocation maps to record the allocation of extents:

  • Mapa de asignación global (GAM) Global Allocation Map (GAM)
    Las páginas GAM registran las extensiones que han sido asignadas.GAM pages record what extents have been allocated. Cada GAM cubre 64 000 extensiones o casi 4 GB de datos.Each GAM covers 64,000 extents, or almost 4 gigabytes (GB) of data. La página GAM tiene un bit por cada extensión del intervalo que cubre.The GAM has 1-bit for each extent in the interval it covers. Si el bit es 1, la extensión está disponible; si el bit es 0, la extensión está asignada.If the bit is 1, the extent is free; if the bit is 0, the extent is allocated.

  • Mapa de asignación global compartido (SGAM) Shared Global Allocation Map (SGAM)
    Las páginas SGAM registran las extensiones que actualmente se están utilizando como extensiones mixtas y además tienen al menos una página sin utilizar.SGAM pages record which extents are currently being used as mixed extents and also have at least one unused page. Cada SGAM cubre 64 000 extensiones o casi 4 GB de datos.Each SGAM covers 64,000 extents, or almost 4-GB of data. La SGAM tiene un bit por cada extensión del intervalo que cubre.The SGAM has 1-bit for each extent in the interval it covers. Si el bit es 1, la extensión se está utilizando como extensión mixta y tiene una página disponible.If the bit is 1, the extent is being used as a mixed extent and has a free page. Si el bit es 0, la extensión no se utiliza como extensión mixta o se trata de una extensión mixta cuyas páginas están todas en uso.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.

Todas las extensiones tienen establecidos los siguientes patrones de bits en las página GAM y SGAM, basados en su uso actual.Each extent has the following bit patterns set in the GAM and SGAM, based on its current use.

Uso actual de la extensiónCurrent use of extent Bit en GAMGAM bit setting Bit en SGAMSGAM bit setting
Disponible, no se utilizaFree, not being used 11 00
Extensión uniforme o extensión mixta completaUniform extent, or full mixed extent 00 00
Extensión mixta con páginas disponiblesMixed extent with free pages 00 11

Esto hace que los algoritmos de administración de las extensiones sean sencillos.This causes simple extent management algorithms.

  • Para asignar una extensión uniforme, Motor de base de datos de SQL ServerSQL Server Database Engine busca un bit 1 en la página GAM y lo establece en 0.To allocate a uniform extent, the Motor de base de datos de SQL ServerSQL Server Database Engine searches the GAM for a 1 bit and sets it to 0.
  • Para buscar una extensión mixta con páginas disponibles, Motor de base de datos de SQL ServerSQL Server Database Engine busca un bit 1 en la página SGAM.To find a mixed extent with free pages, the Motor de base de datos de SQL ServerSQL Server Database Engine searches the SGAM for a 1 bit.
  • Para asignar una extensión mixta, Motor de base de datos de SQL ServerSQL Server Database Engine busca 1 bit en la página GAM, lo establece en 0 y, a continuación, establece también en 1 el bit correspondiente de la página SGAM.To allocate a mixed extent, the Motor de base de datos de 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.
  • Para desasignar una extensión, Motor de base de datos de SQL ServerSQL Server Database Engine se asegura de que el bit de la página GAM esté establecido en 1 y el bit de la página SGAM en 0.To deallocate an extent, the Motor de base de datos de SQL ServerSQL Server Database Engine makes sure that the GAM bit is set to 1 and the SGAM bit is set to 0. Los algoritmos internos usados realmente por Motor de base de datos de SQL ServerSQL Server Database Engine son más complejos que los mencionados en este artículo, puesto que Motor de base de datos de SQL ServerSQL Server Database Engine distribuye los datos en la base de datos de manera uniforme.The algorithms that are actually used internally by the Motor de base de datos de SQL ServerSQL Server Database Engine are more sophisticated than what is described in this article, because the Motor de base de datos de SQL ServerSQL Server Database Engine distributes data evenly in a database. Sin embargo, incluso los algoritmos reales quedan simplificados al no tener que administrar cadenas de información de asignación de extensiones.However, even the real algorithms are simplified by not having to manage chains of extent allocation information.

Realizar un seguimiento del espacio libreTracking free space

Las páginas Espacio disponible en páginas (PFS) registran el estado de asignación de cada página, si una página concreta está asignada y la cantidad de espacio libre en cada página.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. La PFS tiene un byte por página, que registra si la página está asignada y, en tal caso, si está vacía, llena entre el 1 y el 50 %, entre el 51 y el 80 %, entre el 81 y el 95 % o entre el 96 y el 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.

Una vez que se ha asignado una extensión a un objeto, el Motor de base de datos de SQL ServerSQL Server Database Engine utiliza las páginas PFS para registrar las páginas de la extensión que están asignadas o libres.After an extent has been allocated to an object, the Motor de base de datos de SQL ServerSQL Server Database Engine uses the PFS pages to record which pages in the extent are allocated or free. Esta información se utiliza cuando el Motor de base de datos de SQL ServerSQL Server Database Engine tiene que asignar una nueva página.This information is used when the Motor de base de datos de SQL ServerSQL Server Database Engine has to allocate a new page. La cantidad de espacio libre de una página solo se mantiene en páginas de texto e imagen y de montón.The amount of free space in a page is only maintained for heap and Text/Image pages. Se utiliza cuando el Motor de base de datos de SQL ServerSQL Server Database Engine tiene que buscar una página con espacio libre disponible para almacenar una fila recién insertada.It is used when the Motor de base de datos de SQL ServerSQL Server Database Engine has to find a page with free space available to hold a newly inserted row. Los índices no necesitan que se haga un seguimiento del espacio libre en páginas, porque el punto en el que se inserta una nueva fila se establece mediante los valores de clave del índice.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.

En el archivo de datos se agrega una nueva página PFS, GAM o SGAM para cada intervalo adicional del que se realiza el seguimiento.A new PFS, GAM or SGAM page is added in the data file for every additional range that it keeps track of. Por tanto, hay una nueva página PFS 8088 páginas después de la primera página PFS, y páginas PFS adicionales en intervalos posteriores de 8088 páginas.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. Como ejemplo, el id. de página 1 es una página PFS, el id. de página 8088 es una página PFS, el id. de página 16176 es una página PFS, etc.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. Hay una nueva página GAM de 64 000 extensiones después de la primera página GAM, y realiza un seguimiento de las 64 000 extensiones que la siguen; la secuencia continúa en intervalos de 64 000 extensiones.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. Del mismo modo, hay una nueva página de SGAM 64 000 extensiones después de la primera página SGAM y páginas SGAM adicionales en intervalos de 64 000 extensiones posteriores.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. En la siguiente ilustración se muestra la secuencia de páginas que usa Motor de base de datos de SQL ServerSQL Server Database Engine para asignar y administrar extensiones.The following illustration shows the sequence of pages used by the Motor de base de datos de SQL ServerSQL Server Database Engine to allocate and manage extents.

manage_extents

Administración del espacio utilizado por los objetosManaging space used by objects

Una página del Mapa de asignación de índices (IAM) asigna las extensiones en una parte de 4 GB de un archivo de base de datos usado por una unidad de asignación.An Index Allocation Map (IAM) page maps the extents in a 4-GB part of a database file used by an allocation unit. Existen tres tipos de unidades de asignación:An allocation unit is one of three types:

  • IN_ROW_DATAIN_ROW_DATA
    Contiene una partición de un montón o un índice.Holds a partition of a heap or index.

  • LOB_DATALOB_DATA
    Contiene tipos de objetos grandes (LOB), como XML, VARBINARY(max) y VARCHAR(max).Holds large object (LOB) data types, such as XML, VARBINARY(max), and VARCHAR(max).

  • ROW_OVERFLOW_DATAROW_OVERFLOW_DATA
    Contiene datos de longitud variable almacenados en columnas VARCHAR, NVARCHAR, VARBINARY o SQL_VARIANT que superan el límite de tamaño de fila de 8060 bytes.Holds variable length data stored in VARCHAR, NVARCHAR, VARBINARY, or SQL_VARIANT columns that exceed the 8,060 byte row size limit.

Cada partición de un montón o un índice contiene al menos una unidad de asignación IN_ROW_DATA.Each partition of a heap or index contains at least an IN_ROW_DATA allocation unit. También puede contener una unidad de asignación LOB_DATA o ROW_OVERFLOW_DATA en función del esquema del montón o el índice.It may also contain a LOB_DATA or ROW_OVERFLOW_DATA allocation unit, depending on the heap or index schema.

Una página IAM cubre un intervalo de 4 GB en un archivo, lo que equivale a la cobertura de una página GAM o SGAM.An IAM page covers a 4-GB range in a file and is the same coverage as a GAM or SGAM page. Si la unidad de asignación contiene extensiones de más de un archivo o más de un intervalo de 4 GB de un archivo, se vincularán varias páginas IAM en una cadena 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. Por lo tanto, cada unidad de asignación tiene como mínimo una página IAM para cada archivo en el que tiene extensiones.Therefore, each allocation unit has at least one IAM page for each file on which it has extents. También puede haber más de una página IAM en un archivo si el intervalo de las extensiones del archivo asignado a la unidad de asignación supera el intervalo que una sola página IAM puede registrar.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

Las páginas IAM se asignan según se necesitan para cada unidad de asignación y se ubican en el archivo de forma aleatoria.IAM pages are allocated as required for each allocation unit and are located randomly in the file. La vista del sistema sys.system_internals_allocation_units apunta a la primera página IAM de una unidad de asignación.The sys.system_internals_allocation_units system view points to the first IAM page for an allocation unit. Todas las páginas IAM de esa unidad de asignación se vinculan en una cadena IAM.All the IAM pages for that allocation unit are linked in an IAM chain.

Importante

La vista de sistema sys.system_internals_allocation_units se ha diseñado para uso interno y está sujeta a cambios, por lo queThe sys.system_internals_allocation_units system view is for internal use only and is subject to change. la compatibilidad no está garantizada.Compatibility is not guaranteed. Esta vista no está disponible en Azure SQL DatabaseAzure SQL Database.This view is not available in Azure SQL DatabaseAzure SQL Database.

iam_chain

Páginas IAM vinculadas en una cadena por unidad de asignación Una página IAM tiene un encabezado que indica la extensión inicial del intervalo de extensiones asignado por la página 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 página IAM también tiene un mapa de bits grande en el que cada bit representa una extensión.The IAM page also has a large bitmap in which each bit represents one extent. El primer bit del mapa representa la primera extensión del intervalo, el segundo bit representa la segunda extensión, etc.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 es 0, la extensión que representa no está asignada a la unidad de asignación propietaria de IAM.If a bit is 0, the extent it represents is not allocated to the allocation unit owning the IAM. Si el bit es 1, la extensión que representa está asignada a la unidad de asignación propietaria de la página IAM.If the bit is 1, the extent it represents is allocated to the allocation unit owning the IAM page.

Si Motor de base de datos de SQL ServerSQL Server Database Engine necesita insertar una fila nueva y no hay espacio disponible en la página actual, utiliza las páginas IAM y PFS para buscar una página para la asignación o, en el caso de un montón o una página de texto o imagen, una página con espacio suficiente para contener la fila.When the Motor de base de datos de 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. Motor de base de datos de SQL ServerSQL Server Database Engine utiliza las páginas IAM para buscar las extensiones asignadas a la unidad de asignación.The Motor de base de datos de SQL ServerSQL Server Database Engine uses the IAM pages to find the extents allocated to the allocation unit. Para cada extensión, Motor de base de datos de SQL ServerSQL Server Database Engine busca las páginas PFS para ver si existe una página que se pueda utilizar.For each extent, the Motor de base de datos de SQL ServerSQL Server Database Engine searches the PFS pages to see if there is a page that can be used. Cada página IAM y PFS cubre muchas páginas de datos, por lo que en una base de datos hay pocas páginas IAM y PFS.Each IAM and PFS page covers lots of data pages, so there are few IAM and PFS pages in a database. Esto significa que las páginas IAM y PFS están generalmente en el grupo de búferes de SQL ServerSQL Server y se pueden buscar con rapidez.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. Para los índices, el punto de inserción de una fila nueva se establece mediante la clave de índice, pero cuando se necesita una página nueva, se produce el proceso descrito anteriormente.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.

Motor de base de datos de SQL ServerSQL Server Database Engine solo asigna una nueva extensión a una unidad de asignación cuando no puede encontrar rápidamente una página en una extensión existente con espacio suficiente para almacenar la fila que se va a insertar.The Motor de base de datos de 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.

Motor de base de datos de SQL ServerSQL Server Database Engine asigna las extensiones entre las que están disponibles en el grupo de archivos siguiendo un algoritmo de asignación de relleno proporcional.The Motor de base de datos de SQL ServerSQL Server Database Engine allocates extents from those available in the filegroup using a proportional fill allocation algorithm. Si en el mismo grupo de archivos con dos archivos, uno de ellos tiene el doble de espacio disponible que el otro, se asignarán dos páginas del archivo con más espacio disponible por cada página asignada del otro archivo.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. Esto significa que los archivos de un grupo de archivos tienen un porcentaje de espacio utilizado similar.This means that every file in a filegroup should have a similar percentage of space used.

Realizar un seguimiento de las extensiones modificadasTracking Modified Extents

SQL ServerSQL Server usa dos estructuras de datos internas para realizar un seguimiento de las extensiones modificadas mediante operaciones de copia masiva y de las extensiones modificadas desde la última copia de seguridad completa.uses two internal data structures to track extents modified by bulk copy operations and extents modified since the last full backup. Esas estructuras de datos aceleran en gran medida las copias de seguridad diferenciales.These data structures greatly speed up differential backups. También aceleran el registro de las operaciones de copia masiva cuando una base de datos utiliza el modelo de recuperación optimizado para cargas masivas de registros.They also speed up the logging of bulk copy operations when a database is using the bulk-logged recovery model. Al igual que las páginas del mapa de asignación global (GAM) y del mapa de asignación global compartido (SGAM), estas nuevas estructuras son mapas de bits en los que cada bit representa una única extensión.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.

  • Mapa cambiado diferencial (DCM) Differential Changed Map (DCM)
    Realiza un seguimiento de las extensiones que han cambiado desde la última instrucción BACKUP DATABASE.This tracks the extents that have changed since the last BACKUP DATABASE statement. Si el bit de una extensión es 1, esta se ha modificado desde la última instrucción BACKUP DATABASE.If the bit for an extent is 1, the extent has been modified since the last BACKUP DATABASE statement. Si el bit es 0, la extensión no se ha modificado.If the bit is 0, the extent has not been modified. Las copias de seguridad diferenciales solo leen las páginas DCM para determinar las extensiones que se han modificado.Differential backups read just the DCM pages to determine which extents have been modified. Esto reduce enormemente el número de páginas que debe recorrer una copia de seguridad diferencial.This greatly reduces the number of pages that a differential backup must scan. El tiempo de ejecución de una copia de seguridad diferencial es proporcional al número de extensiones modificadas desde la última instrucción BACKUP DATABASE y no al tamaño global de la base de datos.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.

  • Mapa cambiado masivamente (BCM) Bulk Changed Map (BCM)
    Realiza un seguimiento de las extensiones que se han modificado mediante operaciones de registro masivo desde la última instrucción BACKUP LOG.This tracks the extents that have been modified by bulk logged operations since the last BACKUP LOG statement. Si el bit de una extensión es 1, esta se ha modificado mediante una operación de registro masivo después de la última instrucción 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 el bit es 0, la extensión no se ha modificado mediante operaciones de registro masivo.If the bit is 0, the extent has not been modified by bulk logged operations. Aunque las páginas BCM aparecen en todas las bases de datos, son relevantes únicamente cuando la base de datos está utilizando el modelo de recuperación optimizado para cargas masivas de registros.Although BCM pages appear in all databases, they are only relevant when the database is using the bulk-logged recovery model. En este modelo de recuperación, cuando se ejecuta BACKUP LOG, el proceso de copia de seguridad recorre los BCM buscando extensiones que se hayan modificado.In this recovery model, when a BACKUP LOG is performed, the backup process scans the BCMs for extents that have been modified. A continuación incluye dichas extensiones en la copia de seguridad del registro.It then includes those extents in the log backup. Esto permite recuperar operaciones de registro masivo si se restaura la base de datos a partir de una copia de seguridad y una secuencia de copias de seguridad de registro de transacciones.This lets the bulk logged operations be recovered if the database is restored from a database backup and a sequence of transaction log backups. Las páginas BCM no son relevantes en una base de datos que está utilizando el modelo de recuperación simple, porque no se registran las operaciones de registro masivo.BCM pages are not relevant in a database that is using the simple recovery model, because no bulk logged operations are logged. No son relevantes en una base de datos que utiliza el modelo de recuperación completa, porque este modelo trata las operaciones de registro masivo como operaciones de registro completo.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.

El intervalo entre las páginas DCM y BCM es el mismo que el intervalo entre las páginas GAM y SGAM, es decir, 64.000 extensiones.The interval between DCM pages and BCM pages is the same as the interval between GAM and SGAM page, 64,000 extents. Las páginas DCM y BCM se colocan después de las páginas GAM y SGAM en un archivo físico:The DCM and BCM pages are located behind the GAM and SGAM pages in a physical file:

special_page_order

Consulte tambiénSee Also

sys.allocation_units (Transact-SQL) sys.allocation_units (Transact-SQL)
Montones (tablas sin índices agrupados) Heaps (Tables without Clustered Indexes)
sys.dm_db_page_info sys.dm_db_page_info
Leer páginas Reading Pages
Escribir páginasWriting Pages