Guia de arquitetura de página e extensõesPages and Extents Architecture Guide

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

A página é a unidade fundamental de armazenamento de dados do SQL ServerSQL Server.The page is the fundamental unit of data storage in SQL ServerSQL Server. Uma extensão consiste em uma coleção de oito páginas fisicamente contíguas.An extent is a collection of eight physically contiguous pages. As extensões ajudam a gerenciar páginas de maneira eficaz.Extents help efficiently manage pages. Este guia descreve as estruturas de dados que são usadas para gerenciar páginas e extensões em todas as versões do SQL Server.This guide describes the data structures that are used to manage pages and extents in all versions of SQL Server. Entender a arquitetura de páginas e extensões é importante para projetar e desenvolver bancos de dados que tenham um desempenho eficiente.Understanding the architecture of pages and extents is important for designing and developing databases that perform efficiently.

Páginas e ExtensõesPages and Extents

A unidade fundamental de armazenamento de dados no SQL ServerSQL Server é a página.The fundamental unit of data storage in SQL ServerSQL Server is the page. O espaço em disco alocado a um arquivo de dados (.mdf ou .ndf) em um banco de dados é logicamente dividido em páginas numeradas de forma contígua 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. As operações de E/S de disco são executadas no nível de página.Disk I/O operations are performed at the page level. Ou seja, o SQL Server lê ou grava páginas de dados inteiras.That is, SQL Server reads or writes whole data pages.

As extensões são uma coleção de oito páginas fisicamente contíguas e são usadas para gerenciar as páginas de forma eficaz.Extents are a collection of eight physically contiguous pages and are used to efficiently manage the pages. Todas as páginas são armazenadas em extensões.All pages are stored in extents.

PáginasPages

Em SQL ServerSQL Server, o tamanho da página é de 8 KB.In SQL ServerSQL Server, the page size is 8-KB. Isso significa que os bancos de dados SQL ServerSQL Server têm 128 páginas por megabyte.This means SQL ServerSQL Server databases have 128 pages per megabyte. Cada página começa com um cabeçalho de 96 bytes usado para armazenar informações de sistema sobre a página.Each page begins with a 96-byte header that is used to store system information about the page. Essas informações incluem o número de página, o tipo de página, a quantidade de espaço livre na página e a ID de unidade de alocação do objeto que possui a 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.

A tabela a seguir mostra os tipos de página usados nos arquivos de dados de um banco de dados 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 SumárioContents
DataData Linhas de dados com todos os dados, exceto os dados de texto, ntext, imagem, nvarchar (max), varchar (max), varbinary (max) e xml, quando o texto na linha estiver definido como 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/ImagemText/Image Tipos de dados de objeto grandes: (dados de texto, ntext, image, nvarchar(max), varchar(max), varbinary(max) e xml)Large object data types: (text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data)
Colunas de comprimento variável quando a linha de dados exceder 8 KB: (varchar, nvarchar, varbinary e sql_variant)Variable length columns when the data row exceeds 8 KB: (varchar, nvarchar, varbinary, and sql_variant)
Global Allocation Map, Shared Global Allocation MapGlobal Allocation Map, Shared Global Allocation Map Informações sobre alocação de extensões.Information about whether extents are allocated.
PFS (Espaço Livre na Página)Page Free Space (PFS) Informações sobre alocação de página e espaço livre disponível em páginas.Information about page allocation and free space available on pages.
Página IAMIndex Allocation Map Informações sobre extensões usadas por uma tabela ou índice por unidade de alocação.Information about extents used by a table or index per allocation unit.
Bulk Changed MapBulk Changed Map Informações sobre extensões modificadas pelas operações em massa desde a última instrução BACKUP LOG por unidade de alocação.Information about extents modified by bulk operations since the last BACKUP LOG statement per allocation unit.
Differential Changed MapDifferential Changed Map Informações sobre extensões modificadas desde a última instrução BACKUP DATABASE por unidade de alocação.Information about extents that have changed since the last BACKUP DATABASE statement per allocation unit.

Observação

Os arquivos de log não contêm páginas; eles contêm uma série de registros de log.Log files do not contain pages; they contain a series of log records.

As linhas de dados são colocadas em série na página, iniciando imediatamente após o cabeçalho.Data rows are put on the page serially, starting immediately after the header. Uma tabela de deslocamento da linha tem início no final da página, e cada tabela de deslocamento da linha contém uma entrada para cada linha na 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 registra a distância do primeiro byte da linha em relação ao início da página.Each entry records how far the first byte of the row is from the start of the page. As entradas na tabela de deslocamento da linha estão em sequência inversa da sequência das linhas na página.The entries in the row offset table are in reverse sequence from the sequence of the rows on the page.

page_architecture

Suporte à linha grandeLarge Row Support

As linhas não podem passar de uma página para outra, no entanto, partes da linha podem ser afastadas da página da linha para que a linha possa ser realmente muito grande.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. A quantidade máxima de dados e sobrecarga contida em uma única linha de uma página é de 8.060 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). Porém, isso não inclui os dados armazenados no tipo de página de Texto/Imagem.However, this does not include the data stored in the Text/Image page type.

Essa restrição é suavizada para tabelas que contêm colunas varchar, nvarchar, varbinary ou sql_variant.This restriction is relaxed for tables that contain varchar, nvarchar, varbinary, or sql_variant columns. Quando o tamanho total da linha de todas as colunas fixas e variáveis em uma tabela exceder a limitação de 8.060 bytes, o SQL ServerSQL Server moverá uma ou mais colunas de comprimento variável dinamicamente para as páginas na unidade de alocação ROW_OVERFLOW_DATA, iniciando com a coluna com a maior largura.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.

Isso é feito sempre que uma operação de inserção ou atualização aumenta o tamanho total da linha além do limite de 8.060 bytes.This is done whenever an insert or update operation increases the total size of the row beyond the 8,060-byte limit. Quando uma coluna é movida para uma página na unidade de alocação ROW_OVERFLOW_DATA, é mantido um ponteiro de 24 bytes na página original da unidade de alocação 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. Se uma operação subsequente reduzir o tamanho da linha, o SQL ServerSQL Server moverá as colunas dinamicamente para a página de dados original.If a subsequent operation reduces the row size, SQL ServerSQL Server dynamically moves the columns back to the original data page.

Considerações sobre dados de estouro de linhaRow-Overflow Considerations

Quando você combina colunas de tipo de dado CLR definido pelo usuário, varchar, nvarchar, varbinary ou sql_variant que excedem 8.060 bytes por linha, considere o seguinte:When you combine varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns that exceed 8,060 bytes per row, consider the following:

  • A movimentação de registros volumosos para outra página ocorre dinamicamente à medida que os registros aumentam com base nas operações de atualização.Moving large records to another page occurs dynamically as records are lengthened based on update operations. As operações de atualização que diminuem os registros podem fazer com que os registros sejam retornados para a página original na unidade de alocação 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. A consulta e execução de outras operações de seleção, como classificações ou junções em grandes registros que contêm tempo de processamento de dados de estouro de linha lento, uma vez que esses registros são processados de forma síncrona em vez de assíncrona.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.
    Portanto, quando você cria uma tabela com várias colunas de tipo de dado CLR definido pelo usuário, varchar, nvarchar, varbinary ou sql_variant, considere a porcentagem de linhas com probabilidade de exceder e a frequência com que os dados de estouro devem ser provavelmente consultados.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. Se houver provavelmente consultas frequentes em várias linhas dos dados de estouro de linha, considere normalizar a tabela de modo que algumas colunas sejam movidas para outra tabela.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. Em seguida, isso pode ser consultado em uma operação JOIN assíncrona.This can then be queried in an asynchronous JOIN operation.
  • O comprimento de colunas individuais deve ainda se encaixar no limite de 8.000 bytes para colunas varchar, nvarchar, varbinary, sql_variant e colunas tipo de dado CLR definido pelo usuário.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. Só os comprimentos combinados delas podem exceder o limite de linha de 8.060 bytes de uma tabela.Only their combined lengths can exceed the 8,060-byte row limit of a table.
  • A soma de outras colunas de tipo de dados, inclusive dados char e nchar deve enquadrar-se no limite de linha de 8.060 bytes.The sum of other data type columns, including char and nchar data, must fall within the 8,060-byte row limit. Dados de objeto grandes também estão isentos do limite de linha de 8.060 bytes.Large object data is also exempt from the 8,060-byte row limit.
  • A chave de um índice clusterizado não pode conter colunas varchar que tenham dados existentes na unidade de alocação 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. Se um índice clusterizado for criado em uma coluna varchar e os dados existentes estiverem na unidade de alocação IN_ROW_DATA, as ações subsequentes de inserção ou atualização na coluna que efetuaria o push dos dados da linha apresentarão falha.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 saber mais sobre unidades de alocação, veja Organização de tabela e índice.For more information about allocation units, see Table and Index Organization.
  • Você pode incluir colunas contendo dados de estouro de linha como colunas de chave ou não chave de um índice não clusterizado.You can include columns that contain row-overflow data as key or nonkey columns of a nonclustered index.
  • O limite do tamanho de registros para tabelas que usam colunas esparsas é de 8.018 bytes.The record-size limit for tables that use sparse columns is 8,018 bytes. Quando os dados convertidos mais os dados de registros existentes ultrapassam os 8.018 bytes, é retornado o ERRO MSSQLSERVER 576.When the converted data plus existing record data exceeds 8,018 bytes, MSSQLSERVER ERROR 576 is returned. Quando colunas são convertidas entre tipos esparsos e não esparsos, o Mecanismo de Banco de Dados mantém uma cópia dos dados de registros atuais.When columns are converted between sparse and nonsparse types, Database Engine keeps a copy of the current record data. Isso dobra temporariamente o armazenamento exigido para o registro.This temporarily doubles the storage that is required for the record.
  • Para obter informações sobre tabelas ou índices que podem conter dados de estouro de linha, use a função de gerenciamento dinâmico 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.

ExtensõesExtents

As extensões são a unidade básica em que o espaço é gerenciado.Extents are the basic unit in which space is managed. Uma extensão tem oito páginas fisicamente contíguas ou 64 KB.An extent is eight physically contiguous pages, or 64 KB. Isso significa que os bancos de dados do SQL Server têm 16 extensões por megabyte.This means SQL Server databases have 16 extents per megabyte.

O SQL ServerSQL Server tem dois tipos de extensões:SQL ServerSQL Server has two types of extents:

  • Extensões uniformes que pertencem a um único objeto; todas as oito páginas na extensão podem ser usadas apenas pelo objeto proprietário.Uniform extents are owned by a single object; all eight pages in the extent can only be used by the owning object.
  • Extensões mistas compartilhadas por até oito objetos.Mixed extents are shared by up to eight objects. Cada uma das oito páginas da extensão pode pertencer a um objeto diferente.Each of the eight pages in the extent can be owned by a different object.

Até, e incluindo, o SQL Server 2014 (12.x)SQL Server 2014 (12.x), o SQL ServerSQL Server não aloca extensões inteiras a tabelas com quantidades pequenas de dados.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. Uma nova tabela ou índice geralmente aloca páginas de extensões mistas.A new table or index generally allocates pages from mixed extents. Quando a tabela ou o índice cresce até adquirir oito páginas, é alternado para usar extensões uniformes para alocações subsequentes.When the table or index grows to the point that it has eight pages, it then switches to use uniform extents for subsequent allocations. Se um índice for criado em uma tabela existente que tiver linhas suficientes para gerar oito páginas no índice, todas as alocações para o índice estarão em extensões 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. No entanto, começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), o padrão para todas as alocações no banco de dados é de extensões 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.

Extensões

Observação

Até, e incluindo, o SQL Server 2014 (12.x)SQL Server 2014 (12.x), o sinalizador de rastreamento 1118 pode ser usado para alterar a alocação padrão para sempre usar extensões 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 obter mais informações sobre este sinalizador de rastreamento, consulte DBCC TRACEON – Sinalizadores de rastreamento.For more information about this trace flag, see DBCC TRACEON - Trace Flags.

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), a funcionalidade fornecida pelo sinalizador de rastreamento 1118 é habilitada automaticamente para o TempDB.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the functionality provided by TF 1118 is automatically enabled for TempDB. Para bancos de dados de usuário, esse comportamento é controlado pela opção SET MIXED_PAGE_ALLOCATION de ALTER DATABASE, com o valor padrão definido como OFF, e o sinalizador de rastreamento 1118 não tem nenhum efeito.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 obter mais informações, veja Opções ALTER DATABASE SET (Transact-SQL).For more information, see ALTER DATABASE SET Options (Transact-SQL).

Gerenciando alocações de extensão e espaço livreManaging Extent Allocations and Free Space

As estruturas de dados do SQL ServerSQL Server que gerenciam alocações de extensão e controlam o espaço livre têm uma estrutura relativamente simples.The SQL ServerSQL Server data structures that manage extent allocations and track free space have a relatively simple structure. Seus benefícios são:This has the following benefits:

  • As informações de espaço livre são compactadas, portanto, poucas páginas contêm essas informações.The free space information is densely packed, so relatively few pages contain this information.
    Isso aumenta a velocidade reduzindo a quantidade de leituras de disco exigidas para recuperar as informações de alocação.This increases speed by reducing the amount of disk reads that are required to retrieve allocation information. Além disso, também aumenta a chance de as páginas de alocação permanecerem na memória e não exigirem mais leituras.This also increases the chance that the allocation pages will remain in memory and not require more reads.

  • A maioria das informações de alocação não é encadeada.Most of the allocation information is not chained together. Isso simplifica a manutenção das informações de alocação.This simplifies the maintenance of the allocation information.
    Cada alocação ou desalocação de página pode ser executada rapidamente.Each page allocation or deallocation can be performed quickly. O que diminui a contenção entre tarefas simultâneas que precisam alocar ou desalocar páginas.This decreases the contention between concurrent tasks having to allocate or deallocate pages.

Gerenciando alocações de extensãoManaging Extent Allocations

O SQL ServerSQL Server usa dois tipos de mapas de alocação para registrar a alocação de extensões:SQL ServerSQL Server uses two types of allocation maps to record the allocation of extents:

  • GAM (Global Allocation Map) Global Allocation Map (GAM)
    As páginas GAM registram quais extensões foram alocadas.GAM pages record what extents have been allocated. Cada GAM cobre 64.000 extensões ou quase 4 GB (gigabytes) de dados.Each GAM covers 64,000 extents, or almost 4 gigabytes (GB) of data. O GAM tem 1 bit para cada extensão no intervalo que cobre.The GAM has 1-bit for each extent in the interval it covers. Se o bit for 1, a extensão será livre; se o bit for 0, a extensão será alocada.If the bit is 1, the extent is free; if the bit is 0, the extent is allocated.

  • SGAM (Shared Global Allocation Map) Shared Global Allocation Map (SGAM)
    As páginas SGAM registram quais extensões estão sendo usadas atualmente como extensões mistas e também têm pelo menos uma página não usada.SGAM pages record which extents are currently being used as mixed extents and also have at least one unused page. Cada SGAM cobre 64.000 extensões ou quase 4 GB de dados.Each SGAM covers 64,000 extents, or almost 4-GB of data. O GAM 1 um bit para cada extensão no intervalo que cobre.The SGAM has 1-bit for each extent in the interval it covers. Se o bit for 1, a extensão será usada como uma extensão mista e terá uma página livre.If the bit is 1, the extent is being used as a mixed extent and has a free page. Se o bit for 0, a extensão não será usada como uma extensão mista, ou será uma extensão mista e todas as suas páginas estarão sendo usadas.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.

Cada extensão tem os padrões de bit a seguir configurados no GAM e no SGAM, com base em seu uso atual.Each extent has the following bit patterns set in the GAM and SGAM, based on its current use.

Uso atual da extensãoCurrent use of extent Configuração de bit GAMGAM bit setting Configuração de bit SGAMSGAM bit setting
Livre, não está sendo usadoFree, not being used 11 00
Extensão uniforme ou extensão mista completaUniform extent, or full mixed extent 00 00
Extensão mista com páginas livresMixed extent with free pages 00 11

Isso gera algoritmos de gerenciamento de extensão simples.This causes simple extent management algorithms.

  • Para alocar uma extensão uniforme, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine pesquisa o GAM de um 1 bit e o define como 0.To allocate a uniform extent, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine searches the GAM for a 1 bit and sets it to 0.
  • Para encontrar uma extensão mista com páginas livres, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine pesquisa o SGAM de um 1 bit.To find a mixed extent with free pages, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine searches the SGAM for a 1 bit.
  • Para alocar uma extensão mista, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine pesquisa o GAM de um 1 bit, o define como 0 e define o bit correspondente no SGAM como 1.To allocate a mixed extent, the Mecanismo de Banco de Dados do 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 desalocar uma extensão, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine verifica se o bit do GAM está definido como 1 e o bit do SGAM como 0.To deallocate an extent, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine makes sure that the GAM bit is set to 1 and the SGAM bit is set to 0. Os algoritmos usados internamente pelo Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine são mais complexos que os descritos neste artigo, porque o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine distribui dados uniformemente em um banco de dados.The algorithms that are actually used internally by the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine are more sophisticated than what is described in this article, because the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine distributes data evenly in a database. No entanto, até os algoritmos reais são simplificados por não precisarem gerenciar cadeias de informações de alocação de extensão.However, even the real algorithms are simplified by not having to manage chains of extent allocation information.

Controlando o espaço livreTracking free space

As páginas PFS (Page Free Space) registram o status de alocação de cada página, se uma página individual foi alocada e a quantidade de espaço livre em 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. O PFS tem 1 byte para cada página, que registra se a página está alocada e, em caso afirmativo, se ela está vazia, de 1 a 50% completa, de 51 a 80% completa, de 81 a 95% completa ou de 96 a 100% completa.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.

Após a alocação de uma extensão a um objeto, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine usa as páginas PFS para registrar quais páginas na extensão são alocadas ou livres.After an extent has been allocated to an object, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine uses the PFS pages to record which pages in the extent are allocated or free. Essas informações são usadas quando o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine precisa alocar uma página nova.This information is used when the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine has to allocate a new page. A quantidade de espaço livre em uma página é mantida apenas para páginas heap e de Texto/Imagem.The amount of free space in a page is only maintained for heap and Text/Image pages. Ela é usada quando o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine precisa encontrar uma página com espaço livre disponível para manter uma linha recentemente inserida.It is used when the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine has to find a page with free space available to hold a newly inserted row. Como o ponto em que a linha nova deve ser inserida é definido pelos valores de chave de índice, os índices não exigem que o espaço livre da página seja controlado.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.

Uma página PFS é a primeira página após a página de cabeçalho do arquivo em um arquivo de dados (ID de página 1).A PFS page is the first page after the file header page in a data file (page ID 1). Ela é seguida por uma página GAM (ID de página 2) e uma página SGAM (ID de página 3).This is followed by a GAM page (page ID 2), and then an SGAM page (page ID 3). Há uma nova página PFS aproximadamente 8.000 páginas após a primeira página PFS, e páginas PFS adicionais em intervalos de 8.000 páginas subsequentes.There is a new PFS page approximately 8,000 pages after the first PFS page, and additional PFS pages in subsequent 8,000 page intervals. Há outra página GAM com 64.000 extensões após a primeira página GAM na página 2, outra página SGAM com 64.000 extensões após a primeira página SGAM na página 3, bem como páginas GAM e SGAM em intervalos de 64.000 extensões subsequentes.There is another GAM page 64,000 extents after the first GAM page on page 2, another SGAM page 64,000 extents after the first SGAM page on page 3, and additional GAM and SGAM pages in subsequent 64,000 extent intervals. A ilustração a seguir mostra a sequência de páginas usada pelo Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine para alocar e gerenciar as extensões.The following illustration shows the sequence of pages used by the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine to allocate and manage extents.

manage_extents

Gerenciando o espaço usado por objetosManaging space used by objects

Uma página IAM mapeia as extensões em uma parte de 4 GB de um arquivo de banco de dados usada por uma unidade de alocação.An Index Allocation Map (IAM) page maps the extents in a 4-GB part of a database file used by an allocation unit. Uma unidade de alocação deve ser de um dos três tipos:An allocation unit is one of three types:

  • IN_ROW_DATAIN_ROW_DATA
    Mantém uma partição de um heap ou um índice.Holds a partition of a heap or index.

  • LOB_DATALOB_DATA
    Contém tipos de dados de LOB (objeto grande), como varchar (max), varbinary (max) e xml.Holds large object (LOB) data types, such as xml, varbinary(max), and varchar(max).

  • ROW_OVERFLOW_DATAROW_OVERFLOW_DATA
    Mantém dados de comprimento variável armazenados em colunas varchar, nvarchar, varbinary ou sql_variant que excedem o limite de tamanho de linha de 8.060 bytes.Holds variable length data stored in varchar, nvarchar, varbinary, or sql_variant columns that exceed the 8,060 byte row size limit.

Cada partição de um heap ou um índice contém pelo menos uma unidade de alocação de IN_ROW_DATA.Each partition of a heap or index contains at least an IN_ROW_DATA allocation unit. Também pode conter uma unidade de alocação do LOB_DATA ou ROW_OVERFLOW_DATA, dependendo do esquema do heap ou índice.It may also contain a LOB_DATA or ROW_OVERFLOW_DATA allocation unit, depending on the heap or index schema.

Uma página IAM cobre um intervalo de 4 GB em um arquivo e tem a mesma cobertura de uma página 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. Se a unidade de alocação contiver extensões de mais de um arquivo, ou mais de um intervalo de 4 GB de um arquivo, haverá várias páginas IAM vinculadas com uma cadeia de 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. Portanto, cada unidade de alocação tem pelo menos uma página IAM para cada arquivo no qual tem extensões.Therefore, each allocation unit has at least one IAM page for each file on which it has extents. Também poderá haver mais de uma página IAM em um arquivo, se o intervalo das extensões no arquivo alocado à unidade de alocação exceder o intervalo que uma única página IAM pode 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

As páginas IAM são alocadas conforme exigido para cada unidade de alocação e ficam localizadas aleatoriamente no arquivo.IAM pages are allocated as required for each allocation unit and are located randomly in the file. A exibição de sistema, sys.system_internals_allocation_units, aponta para a primeira página IAM de uma unidade de alocação.The system view, sys.system_internals_allocation_units, points to the first IAM page for an allocation unit. Todas as páginas IAM para aquela unidade de alocação são vinculadas em uma cadeia.All the IAM pages for that allocation unit are linked in a chain.

Importante

A exibição de sistema sys.system_internals_allocation_units é destinada apenas para uso interno e está sujeita a alterações.The sys.system_internals_allocation_units system view is for internal use only and is subject to change. A compatibilidade não é garantida.Compatibility is not guaranteed.

iam_chain

Páginas IAM vinculadas em uma unidade de cadeia por alocação. Uma página IAM tem um cabeçalho que indica a extensão inicial do intervalo de extensões mapeado pela 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. A página IAM também tem um bitmap grande no qual cada bit representa uma extensão.The IAM page also has a large bitmap in which each bit represents one extent. O primeiro bit no mapa representa a primeira extensão no intervalo, o segundo bit representa a segunda extensão, e assim por diante.The first bit in the map represents the first extent in the range, the second bit represents the second extent, and so on. Se um bit for 0, a extensão que ele representa não será alocada à unidade de alocação que possui IAM.If a bit is 0, the extent it represents is not allocated to the allocation unit owning the IAM. Se o bit for 1, a extensão que ele representa será alocada à unidade de alocação que possui página IAM.If the bit is 1, the extent it represents is allocated to the allocation unit owning the IAM page.

Quando o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine precisar inserir uma linha nova e não houver espaço disponível na página atual, ele usará as páginas IAM e PFS para localizar uma página para alocação ou, para um heap ou uma página de Texto/Imagem, uma página com espaço suficiente para manter a linha.When the Mecanismo de Banco de Dados do 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. O Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine usa as páginas IAM para localizar as extensões alocadas à unidade de alocação.The Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine uses the IAM pages to find the extents allocated to the allocation unit. Para cada extensão, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine pesquisa as páginas PFS para verificar se há uma página que possa ser usada.For each extent, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine searches the PFS pages to see if there is a page that can be used. Cada página IAM e PFS abrange muitas páginas de dados, portanto, há poucas páginas IAM e PFS em um banco de dados.Each IAM and PFS page covers lots of data pages, so there are few IAM and PFS pages in a database. Isso significa que as páginas IAM e PFS geralmente estão na memória do pool de buffers SQL ServerSQL Server, portanto, elas podem ser pesquisadas rapidamente.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 índices, o ponto de inserção de uma nova linha é definido pela chave de índice, mas quando uma nova página é necessária, ocorre o processo 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.

O Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine só alocará uma extensão nova a uma unidade de alocação quando não conseguir encontrar uma página rapidamente em uma extensão existente com espaço suficiente para manter a linha que estiver sendo inserida.The Mecanismo de Banco de Dados do 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.

O Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine aloca as extensões disponíveis no grupo de arquivos usando um algoritmo de alocação de preenchimento proporcional.The Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine allocates extents from those available in the filegroup using a proportional fill allocation algorithm. Se, em um grupo de arquivos com dois arquivos, um deles tiver duas vezes mais espaço livre do que o outro, serão alocadas duas páginas do arquivo com o espaço disponível para cada página alocada do outro arquivo.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. Isso significa que todo arquivo em um grupo de arquivos deve ter uma porcentagem semelhante de espaço usado.This means that every file in a filegroup should have a similar percentage of space used.

Controlando extensões modificadasTracking Modified Extents

O SQL ServerSQL Server usa duas estruturas de dados internas para acompanhar extensões modificadas por operações de cópia em massa e extensões modificadas desde o último backup completo.SQL ServerSQL Server uses two internal data structures to track extents modified by bulk copy operations and extents modified since the last full backup. Essas estruturas de dados aceleram consideravelmente os backups diferenciais.These data structures greatly speed up differential backups. Elas também aceleram o registro de operações de cópia em massa quando um banco de dados está usando o modelo de recuperação bulk logged.They also speed up the logging of bulk copy operations when a database is using the bulk-logged recovery model. Como as páginas GAM (Global Alocação Map) e SGAM (Shared Global Allocation Map), essas estruturas são bitmaps em que cada bit representa uma única extensão.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)
    Acompanha as extensões que foram alteradas desde a última instrução BACKUP DATABASE.This tracks the extents that have changed since the last BACKUP DATABASE statement. Se o bit de uma extensão for 1, isso significa que a extensão foi modificada desde a última instrução BACKUP DATABASE.If the bit for an extent is 1, the extent has been modified since the last BACKUP DATABASE statement. Se o bit for 0, a extensão não foi modificada.If the bit is 0, the extent has not been modified. Os backups diferenciais leem apenas as páginas DCM para determinar quais extensões foram modificadas.Differential backups read just the DCM pages to determine which extents have been modified. Isso reduz significativamente o número de páginas que um backup diferencial deve examinar.This greatly reduces the number of pages that a differential backup must scan. O tempo de execução de um backup diferencial é proporcional ao número de extensões modificadas desde a última instrução BACKUP DATABASE, e não ao tamanho geral do banco de dados.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)
    Acompanha as extensões modificadas pelas operações registradas em log em massa desde a última instrução BACKUP LOG.This tracks the extents that have been modified by bulk logged operations since the last BACKUP LOG statement. Se o bit de uma extensão for 1, isso significará que a extensão foi modificada por uma operação registrada em log em massa após a última instrução 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. Se o bit for 0, a extensão não foi modificada pelas operações registradas em massa.If the bit is 0, the extent has not been modified by bulk logged operations. Embora as páginas BCM sejam exibidas em todos os bancos de dados, elas serão relevantes apenas quando o banco de dados estiver usando o modelo de recuperação bulk-logged.Although BCM pages appear in all databases, they are only relevant when the database is using the bulk-logged recovery model. Nesse modelo de recuperação, quando um BACKUP LOG é executado, o processo de backup examina os BCMs em busca das extensões que foram modificadas.In this recovery model, when a BACKUP LOG is performed, the backup process scans the BCMs for extents that have been modified. Depois, inclui essas extensões no backup de log.It then includes those extents in the log backup. Isso permite que as operações registradas em massa sejam recuperadas se o banco de dados for restaurado de um backup de banco de dados e uma sequência de backups de log de transações.This lets the bulk logged operations be recovered if the database is restored from a database backup and a sequence of transaction log backups. As páginas BCM não são relevantes em um banco de dados que usa o modelo de recuperação simples, porque nenhuma operação registrada em massa está registrada.BCM pages are not relevant in a database that is using the simple recovery model, because no bulk logged operations are logged. Elas não são relevantes em um banco de dados que usa o modelo de recuperação completo, porque o modelo de recuperação trata as operações com log em massa como operações registradas completas.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.

O intervalo entre as páginas DCM e BCM é o mesmo que o intervalo entre as páginas GAM e SGAM, 64.000 extensões.The interval between DCM pages and BCM pages is the same as the interval between GAM and SGAM page, 64,000 extents. As páginas DCM e BCM estão localizadas atrás das páginas GAM e SGAM em um arquivo físico:The DCM and BCM pages are located behind the GAM and SGAM pages in a physical file:

special_page_order

Consulte TambémSee Also

sys.allocation_units (Transact-SQL) sys.allocation_units (Transact-SQL)
Heaps (Tabelas sem índices clusterizados) Heaps (Tables without Clustered Indexes)
Lendo Páginas Reading Pages
Gravando PáginasWriting Pages