Руководство по архитектуре страниц и экстентовPages and Extents Architecture Guide

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Страница — основная единица хранения данных в SQL ServerSQL Server.The page is the fundamental unit of data storage in SQL ServerSQL Server. Экстент — это набор из 8 физически непрерывных страниц.An extent is a collection of eight physically contiguous pages. Экстенты помогают эффективно управлять страницами.Extents help efficiently manage pages. В этом руководстве описаны структуры данных, используемые для управления страницами и экстентами во всех версиях SQL Server.This guide describes the data structures that are used to manage pages and extents in all versions of SQL Server. Понимание архитектуры страниц и экстентов важно для проектирования и разработки эффективных баз данных.Understanding the architecture of pages and extents is important for designing and developing databases that perform efficiently.

Страницы и экстентыPages and Extents

Основной единицей хранилища данных в SQL ServerSQL Server является страница.The fundamental unit of data storage in SQL ServerSQL Server is the page. Место на диске, предоставляемое для размещения файла данных (файл MDF или NDF) в базе данных, логически разделяется на страницы с непрерывным перечислением от 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. Дисковые операции ввода-вывода выполняются на уровне страницы.Disk I/O operations are performed at the page level. Это означает, что SQL Server считывает или записывает целые страницы данных.That is, SQL Server reads or writes whole data pages.

Экстент — это коллекция, состоящая из восьми физически непрерывных страниц; они используются для эффективного управления страницами.Extents are a collection of eight physically contiguous pages and are used to efficiently manage the pages. Все страницы хранятся в экстентах.All pages are stored in extents.

СтраницыPages

В SQL ServerSQL Server размер страницы составляет 8 КБ.In SQL ServerSQL Server, the page size is 8-KB. Это значит, что в одном мегабайте базы данных SQL ServerSQL Server содержится 128 страниц.This means SQL ServerSQL Server databases have 128 pages per megabyte. Каждая страница начинается с 96-байтового заголовка, который используется для хранения системных данных о странице.Each page begins with a 96-byte header that is used to store system information about the 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.

В следующей таблице представлены типы страниц, используемые в файлах данных базы данных SQL ServerSQL Server.The following table shows the page types used in the data files of a SQL ServerSQL Server database.

Тип страницыPage type СодержаниеContents
DataData Строки со всеми данными, за исключением типов text, ntext, image, nvarchar(max), varchar(max), varbinary(max) и xml, если для текста в строке установлено значение 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.
ИндексIndex Содержимое индекса.Index entries.
Текст/изображениеText/Image Типы данных больших объектов: text, ntext, image, nvarchar(max), varchar(max), varbinary(max) и данные xml.Large object data types: (text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data)
Столбцы переменной длины, когда размер строки данных превышает 8 КБ: varchar, nvarchar, varbinary и sql_variant.Variable length columns when the data row exceeds 8 KB: (varchar, nvarchar, varbinary, and sql_variant)
Глобальная карта распределения, общая глобальная карта распределенияGlobal Allocation Map, Shared Global Allocation Map Сведения о том, размещены ли экстенты.Information about whether extents are allocated.
Свободное место на страницах (PFS)Page Free Space (PFS) Сведения о размещении страниц и доступном на них свободном месте.Information about page allocation and free space available on pages.
Карта распределения индексаIndex Allocation Map Сведения об экстентах, используемых таблицей или индексом для единицы распределения.Information about extents used by a table or index per allocation unit.
Схема массовых измененийBulk Changed Map Сведения об экстентах, измененных массовыми операциями со времени последнего выполнения инструкции BACKUP LOG для единицы распределения.Information about extents modified by bulk operations since the last BACKUP LOG statement per allocation unit.
Карта изменений для разностной резервной копииDifferential Changed Map Сведения об экстентах, измененных с момента последнего выполнения инструкции BACKUP DATABASE для единицы распределения.Information about extents that have changed since the last BACKUP DATABASE statement per allocation unit.

Примечание

Файлы журнала не содержат страниц, в них содержится последовательность записей журнала.Log files do not contain pages; they contain a series of log records.

Строки данных заносятся на страницу последовательно, сразу же после заголовка.Data rows are put on the page serially, starting immediately after the header. Таблица смещения строк начинается в конце страницы; каждая таблица смещения строк содержит одну запись для каждой строки на странице.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. Каждая запись регистрирует, насколько далеко от начала страницы находится первый байт строки.Each entry records how far the first byte of the row is from the start of the page. Записи в таблице смещения строк находятся в обратном порядке относительно последовательности строк на странице.The entries in the row offset table are in reverse sequence from the sequence of the rows on the page.

page_architecture

Поддержка больших строкLarge Row Support

Строка не может находиться на нескольких страницах, однако часть строки может быть перемещена на другую страницу, поэтому строка действительно может быть очень большой.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. Максимальный объем данных и служебного кода, содержащихся в одной строке на странице, составляет 8060 байт (8 КБ).The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8-KB). Однако сюда не включены данные, хранимые в типе страницы "Текст/изображение".However, this does not include the data stored in the Text/Image page type.

Это ограничение смягчается для таблиц, содержащих столбцы varchar, nvarchar, varbinary или sql_variant.This restriction is relaxed for tables that contain varchar, nvarchar, varbinary, or sql_variant columns. Когда общий размер строк всех фиксированных и переменных столбцов в таблице превышает предел в 8060 байт, SQL ServerSQL Server динамически перемещает один или более столбцов переменной длины на страницы в единице распределения ROW_OVERFLOW_DATA, начиная со столбца с наибольшей шириной.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.

Это действие выполняется всегда, когда в результате операций вставки или обновления общий размер строки выходит за предел в 8060 байт.This is done whenever an insert or update operation increases the total size of the row beyond the 8,060-byte limit. Когда происходит перемещение столбца на страницу в единице распределения ROW_OVERFLOW_DATA, 24-байтовый указатель на исходной странице в единице распределения 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. Если при последующей выполняемой операции размер строки уменьшается, SQL ServerSQL Server динамически перемещает столбцы обратно на исходную страницу данных.If a subsequent operation reduces the row size, SQL ServerSQL Server dynamically moves the columns back to the original data page.

Замечания относительно переполнения строкRow-Overflow Considerations

При объединении столбцов varchar, nvarchar, varbinary, sql_variant или столбцов определяемого пользователем типа данных CLR, длина которых превышает 8 060 байт на строку, необходимо учитывать следующее:When you combine varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns that exceed 8,060 bytes per row, consider the following:

  • Перемещение больших записей на другую страницу осуществляется динамически, по мере удлинения записей при операциях обновления.Moving large records to another page occurs dynamically as records are lengthened based on update operations. Операции обновления, которые укорачивают записи, могут привести к возвращению записей на исходную страницу в единице распределения 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. Выполнение запросов и других операций выборки, например сортировки и соединения, в отношении больших записей с превышающими размер страницы данными строки, увеличивает время обработки, поскольку эти записи обрабатываются синхронно, а не асинхронно.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.
    Поэтому при построении таблиц с несколькими столбцами varchar, nvarchar, varbinary, sql_variant или столбцами определяемого пользователем типа данных CLR следует учитывать процент строк, в которых возможно переполнение, и вероятную частоту запросов данных переполнения.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. Если ожидаются частые запросы по многим превышающим размер страницы данным строки, рекомендуется нормализовать таблицу таким образом, чтобы некоторые столбцы переместились в другую таблицу.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. После этого запросы по таблице можно будет выполнять с помощью асинхронной операции JOIN.This can then be queried in an asynchronous JOIN operation.
  • Длина отдельных столбцов varchar, nvarchar, varbinary, sql_variant и столбцов определяемого пользователем типа данных CLR по-прежнему не должна превышать 8 000 байт.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. И только общая их длина может выходить за предел в 8 060 байт на строку таблицы.Only their combined lengths can exceed the 8,060-byte row limit of a table.
  • Сумма столбцов данных других типов, включая char и nchar, не должна превышать 8 060 байт на строку.The sum of other data type columns, including char and nchar data, must fall within the 8,060-byte row limit. Данные больших объектов также могут выходить за предел в 8 060 байт на строку.Large object data is also exempt from the 8,060-byte row limit.
  • Ключ кластеризованного индекса не может включать в себя столбцы varchar, для которых существуют данные в единице размещения 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. Если кластеризованный индекс создается для столбца типа varchar и существующие данные располагаются в единице размещения IN_ROW_DATA, то все последующие операции вставки или обновления для данного столбца, выталкивающие данные за пределы строки, будут завершаться ошибкой.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. Дополнительные сведения о единицах распределения см. в разделе "Организация таблиц и индексов".For more information about allocation units, see Table and Index Organization.
  • Пользователь может включить столбцы, которые содержат превышающие размер страницы данные строки, в качестве ключевых или неключевых столбцов некластеризованного индекса.You can include columns that contain row-overflow data as key or nonkey columns of a nonclustered index.
  • Максимальный размер записи в таблицах, в которых используются разреженные столбцы, составляет 8 018 байт.The record-size limit for tables that use sparse columns is 8,018 bytes. Если суммарная величина преобразуемых данных и существующих данных записи превышает 8 018 байт, то возвращается ошибка MSSQLSERVER ERROR 576.When the converted data plus existing record data exceeds 8,018 bytes, MSSQLSERVER ERROR 576 is returned. Если выполняется преобразование разреженных и неразреженных типов, то ядро СУБД хранит копию текущих данных записи.When columns are converted between sparse and nonsparse types, Database Engine keeps a copy of the current record data. В связи с этим удваивается количества места, которое требуется для хранения записи.This temporarily doubles the storage that is required for the record.
  • Для получения сведений о таблицах или индексах, которые могут содержать превышающие размер страницы данные строки, используется функция динамического управления 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.

ЭкстентыExtents

Экстенты являются основными единицами организации пространства.Extents are the basic unit in which space is managed. Экстент состоит из восьми непрерывных страниц или 64 КБ.An extent is eight physically contiguous pages, or 64 KB. Это означает, что в одном мегабайте базы данных SQL Server содержится 16 экстентов.This means SQL Server databases have 16 extents per megabyte.

В SQL ServerSQL Server есть два типа экстентов.SQL ServerSQL Server has two types of extents:

  • Однородные экстенты принадлежат одному объекту, и все восемь страниц экстента может использовать только этот владеющий объект.Uniform extents are owned by a single object; all eight pages in the extent can only be used by the owning object.
  • Смешанные экстенты могут находиться в общем пользовании максимум у восьми объектов.Mixed extents are shared by up to eight objects. Каждая из восьми страниц в экстенте может находиться во владении разных объектов.Each of the eight pages in the extent can be owned by a different object.

До и включая SQL Server 2014 (12.x)SQL Server 2014 (12.x), SQL ServerSQL Server не размещает целые экстенты в таблицы с небольшим объемом данных.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 new table or index generally allocates pages from mixed extents. При увеличении размера таблицы или индекса до восьми страниц эти таблица или индекс переходят на использование однородных экстентов для последовательных единиц распределения.When the table or index grows to the point that it has eight pages, it then switches to use uniform extents for subsequent allocations. При создании индекса для существующей таблицы, в которой содержится достаточно строк, чтобы сформировать восемь страниц в индексе, все единицы распределения для индекса находятся в однородных экстентах.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. Однако, начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x), по умолчанию используются однородные экстенты для всех операций распределения в базе данных.However, starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the default for all allocations in the database is uniform extents.

Экстенты

Примечание

До и включая SQL Server 2014 (12.x)SQL Server 2014 (12.x), флаг трассировки 1118 может использоваться для изменения распределения по умолчанию таким образом, чтобы всегда использовать однородные экстенты.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. Дополнительные сведения об этом флаге трассировки см. в статье DBCC TRACEON — флаги трассировки (Transact-SQL).For more information about this trace flag, see DBCC TRACEON - Trace Flags.

Начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x), функциональные возможности, предоставляемые TF 1118, автоматически включаются для TempDB.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the functionality provided by TF 1118 is automatically enabled for TempDB. Для пользовательских баз данных этим поведением управляет параметр SET MIXED_PAGE_ALLOCATION команды ALTER DATABASE с присвоенным значением OFF (по умолчанию), и флаг трассировки 1118 не действует.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. Дополнительные сведения см. в статье Параметры ALTER DATABASE SET (Transact-SQL).For more information, see ALTER DATABASE SET Options (Transact-SQL).

Управление размещением экстента и свободным местомManaging Extent Allocations and Free Space

Структуры данных SQL ServerSQL Server, управляющие размещением экстента и отслеживанием свободного места, обладают относительно простой структурой.The SQL ServerSQL Server data structures that manage extent allocations and track free space have a relatively simple structure. Это позволяет получить следующие преимущества:This has the following benefits:

  • Сведения о свободном месте плотно упакованы, поэтому эти данные содержат относительно небольшое количество страниц.The free space information is densely packed, so relatively few pages contain this information.
    Это приводит к увеличению скорости из-за уменьшения необходимых операций чтения диска для получения сведений о размещении.This increases speed by reducing the amount of disk reads that are required to retrieve allocation information. Также увеличивается вероятность того, что страницы размещения будут оставаться в памяти и повторных операций чтения не потребуется.This also increases the chance that the allocation pages will remain in memory and not require more reads.

  • Большая часть сведений о размещении не связана по цепочке друг с другом.Most of the allocation information is not chained together. Это упрощает управление сведениями о размещении.This simplifies the maintenance of the allocation information.
    Каждое действие по размещению или освобождению страницы может выполняться быстро.Each page allocation or deallocation can be performed quickly. Это сокращает состязание между одновременными задачами размещения и освобождения страниц.This decreases the contention between concurrent tasks having to allocate or deallocate pages.

Управление размещением экстентаManaging Extent Allocations

SQL ServerSQL Server использует два типа карт распределения для записи размещения экстентов.uses two types of allocation maps to record the allocation of extents:

  • Глобальная карта распределения (GAM) Global Allocation Map (GAM)
    На GAM-страницах записано, какие экстенты были размещены.GAM pages record what extents have been allocated. В каждой карте GAM содержится 64 000 экстентов или почти 4 ГБ данных.Each GAM covers 64,000 extents, or almost 4 gigabytes (GB) of data. В карте GAM приходится по одному биту на каждый экстент в покрываемом им интервале.The GAM has 1-bit for each extent in the interval it covers. Если бит равен 1, то экстент свободен; если бит равен 0, то экстент размещен.If the bit is 1, the extent is free; if the bit is 0, the extent is allocated.

  • Общая глобальная карта распределения (SGAM) Shared Global Allocation Map (SGAM)
    На SGAM-страницах записано, какие экстенты в текущий момент используются в качестве смешанных экстентов и имеют как минимум одну неиспользуемую страницу.SGAM pages record which extents are currently being used as mixed extents and also have at least one unused page. В каждой карте SGAM содержится 64 000 экстентов или почти 4 ГБ данных.Each SGAM covers 64,000 extents, or almost 4-GB of data. В карте SGAM приходится по одному биту на каждый экстент в покрываемом им интервале.The SGAM has 1-bit for each extent in the interval it covers. Если бит равен 1, то экстент используется как смешанный экстент и имеет свободную страницу.If the bit is 1, the extent is being used as a mixed extent and has a free page. Если бит равен 0, то экстент не используется как смешанный экстент, или он является смешанным экстентом, но все его страницы используются.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.

Каждый экстент обладает следующими наборами битовых шаблонов в картах GAM и SGAM, основанными на его текущем использовании.Each extent has the following bit patterns set in the GAM and SGAM, based on its current use.

Текущее использование экстентаCurrent use of extent Настройка битов карты GAMGAM bit setting Настройка битов карты SGAMSGAM bit setting
Свободно, в текущий момент не используетсяFree, not being used 11 00
Однородный экстент или заполненный смешанный экстентUniform extent, or full mixed extent 00 00
Смешанный экстент со свободными страницамиMixed extent with free pages 00 11

Это дает простые алгоритмы управления экстентами страниц.This causes simple extent management algorithms.

  • Для выделения однородного экстента компонент Компонент SQL Server Database EngineSQL Server Database Engine производит на карте GAM поиск бита 1 и заменяет его на бит 0.To allocate a uniform extent, the Компонент SQL Server Database EngineSQL Server Database Engine searches the GAM for a 1 bit and sets it to 0.
  • Для поиска смешанного экстента со свободными страницами компонент Компонент SQL Server Database EngineSQL Server Database Engine производит поиск на карте SGAM бита 1.To find a mixed extent with free pages, the Компонент SQL Server Database EngineSQL Server Database Engine searches the SGAM for a 1 bit.
  • Для выделения смешанного экстента компонент Компонент SQL Server Database EngineSQL Server Database Engine производит на карте GAM поиск бита 1, заменяет его на бит 0, а затем устанавливает значение соответствующего бита на карте SGAM равным 1.To allocate a mixed extent, the Компонент SQL Server Database EngineSQL 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.
  • Для освобождения экстента компонент Компонент SQL Server Database EngineSQL Server Database Engine устанавливает бит GAM равным 1, а соответствующий бит SGAM равным 0.To deallocate an extent, the Компонент SQL Server Database EngineSQL Server Database Engine makes sure that the GAM bit is set to 1 and the SGAM bit is set to 0. Внутренние алгоритмы, которые на самом деле используются компонентом Компонент SQL Server Database EngineSQL Server Database Engine, более сложны, чем это описано в данной статье, так как компонент Компонент SQL Server Database EngineSQL Server Database Engine распределяет данные в базе данных равномерно.The algorithms that are actually used internally by the Компонент SQL Server Database EngineSQL Server Database Engine are more sophisticated than what is described in this article, because the Компонент SQL Server Database EngineSQL Server Database Engine distributes data evenly in a database. Однако даже настоящие алгоритмы упрощаются из-за того, что отпадает необходимость управления цепочками сведений о размещении экстентов.However, even the real algorithms are simplified by not having to manage chains of extent allocation information.

Отслеживание свободного местаTracking free space

Страницы Page Free Space (PFS) записывают состояние размещения каждой страницы, информацию о том, была ли размещена конкретная страница, а также количество свободного места на каждой странице.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. В PFS на каждую страницу приходится по одному байту, хранящему информацию о том, была ли страница размещена или нет, а если была — то пустая она, или ее заполнение находится в промежутке от 1 до 50 процентов, от 51 до 80 процентов, от 81 до 95 процентов или от 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.

После размещения экстента на объект компонент Компонент SQL Server Database EngineSQL Server Database Engine использует PFS-страницы для записи информации о том, какие страницы в экстенте размещены, а какие свободны.After an extent has been allocated to an object, the Компонент SQL Server Database EngineSQL Server Database Engine uses the PFS pages to record which pages in the extent are allocated or free. Эти сведения используются компонентом Компонент SQL Server Database EngineSQL Server Database Engine при размещении новой страницы.This information is used when the Компонент SQL Server Database EngineSQL Server Database Engine has to allocate a new page. Количеством свободного места на странице можно управлять только в случае кучи и страниц Text/Image.The amount of free space in a page is only maintained for heap and Text/Image pages. Это используется при поиске страницы компонентом Компонент SQL Server Database EngineSQL Server Database Engine, обладающей свободным местом, достаточным для сохранения в ней новой добавляемой строки.It is used when the Компонент SQL Server Database EngineSQL Server Database Engine has to find a page with free space available to hold a newly inserted row. Для индексов не требуется, чтобы отслеживалось свободное место на странице, так как место, в которое будет вставляться новая строка, назначается значениями ключа индекса.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.

PFS-страница является первой страницей в файле данных после страницы заголовка файла (страница с ИД 1).A PFS page is the first page after the file header page in a data file (page ID 1). За ней следует страница GAM (страница с ИД 2), а затем — страница SGAM (страница с ИД 3).This is followed by a GAM page (page ID 2), and then an SGAM page (page ID 3). После первой PFS-страницы находится новая PFS-страница с примерно 8000 страницами, а также дополнительные PFS-страницы с последующими интервалами в 8000 страниц.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. После первой GAM-страницы на странице 2 находится другая GAM-страница с 64 000 экстентов, другая SGAM-страница с 64 000 экстентов находится после первой SGAM-страницы на странице 3 и дополнительные страницы GAM и SGAM с последующими интервалами в 64 000 экстентов.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. На следующей иллюстрации показана последовательность страниц, используемая компонентом Компонент SQL Server Database EngineSQL Server Database Engine для выделения экстентов и управления ими.The following illustration shows the sequence of pages used by the Компонент SQL Server Database EngineSQL Server Database Engine to allocate and manage extents.

manage_extents

Управление дисковым пространством, занятым объектамиManaging space used by objects

Страница карты распределения индекса (Index Allocation Map, IAM) сопоставляет экстенты в 4-гигабайтном фрагменте файла базы данных с единицей размещения, использующей этот фрагмент.An Index Allocation Map (IAM) page maps the extents in a 4-GB part of a database file used by an allocation unit. Единица распределения может иметь один из трех типов.An allocation unit is one of three types:

  • IN_ROW_DATAIN_ROW_DATA
    Содержит секцию кучи или индекса.Holds a partition of a heap or index.

  • LOB_DATALOB_DATA
    Содержит типы данных больших объектов (LOB), таких как xml, varbinary(max) и varchar(max).Holds large object (LOB) data types, such as xml, varbinary(max), and varchar(max).

  • ROW_OVERFLOW_DATAROW_OVERFLOW_DATA
    Содержит данные переменной длины, которые хранятся в столбцах varchar, nvarchar, varbinary или sql_variant и превышают допустимый размер строки — 8060 байт.Holds variable length data stored in varchar, nvarchar, varbinary, or sql_variant columns that exceed the 8,060 byte row size limit.

В каждой секции кучи или индекса содержится по крайней мере одна единица распределения IN_ROW_DATA.Each partition of a heap or index contains at least an IN_ROW_DATA allocation unit. Кроме того, в зависимости от схемы кучи или индекса, там могут содержаться единицы распределения LOB_DATA или ROW_OVERFLOW_DATA.It may also contain a LOB_DATA or ROW_OVERFLOW_DATA allocation unit, depending on the heap or index schema.

IAM-страница охватывает в файле диапазон 4 ГБ, то есть столько же, сколько и GAM- или SGAM-страница.An IAM page covers a 4-GB range in a file and is the same coverage as a GAM or SGAM page. Если в единице распределения содержатся экстенты из более чем одного файла или фрагмент файла размером более 4 ГБ, то несколько IAM-страниц будут объединены в 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. Таким образом, каждая единица распределения содержит как минимум одну IAM-страницу для каждого из файлов, в которых содержатся ее экстенты.Therefore, each allocation unit has at least one IAM page for each file on which it has extents. Для файла может существовать несколько IAM-страниц, если размер экстентов файла, назначенного единице распределения, превышает объем, который может быть записан в одной IAM-странице.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

IAM-страницы для каждой единицы распределения выделяются по необходимости и располагаются в файле в случайном порядке.IAM pages are allocated as required for each allocation unit and are located randomly in the file. Системное представление sys.system_internals_allocation_units указывает на первую IAM-страницу единицы распределения.The system view, sys.system_internals_allocation_units, points to the first IAM page for an allocation unit. Все IAM-страницы, относящиеся к одной единице распределения, объединяются в цепочку.All the IAM pages for that allocation unit are linked in a chain.

Важно!

Системное представление sys.system_internals_allocation_units предназначено только для внутреннего использования и может быть изменено.The sys.system_internals_allocation_units system view is for internal use only and is subject to change. Совместимость не гарантируется.Compatibility is not guaranteed.

iam_chain

IAM-страницы, связанные в цепочки для единиц распределения IAM-страница имеет заголовок, который отображает первый экстент из диапазона, сопоставленного с 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. IAM-страница также имеет большую битовую карту, в которой каждый бит представляет экстент.The IAM page also has a large bitmap in which each bit represents one extent. Первый бит схемы представляет первый экстент диапазона, второй бит — второй экстент и т. д.The first bit in the map represents the first extent in the range, the second bit represents the second extent, and so on. Если бит равен 0, то соответствующий ему экстент не привязан к единице распределения, которой принадлежит IAM-страница.If a bit is 0, the extent it represents is not allocated to the allocation unit owning the IAM. Если он равен 1, то соответствующий ему экстент привязан к единице распределения, которой принадлежит IAM-страница.If the bit is 1, the extent it represents is allocated to the allocation unit owning the IAM page.

Когда требуется вставить новую строку, но на текущей странице нет свободного места, компонент Компонент SQL Server Database EngineSQL Server Database Engine через IAM- и PFS-страницу ищет страницу для выделения или (для страниц кучи или текста и изображения) страницу, в которой достаточно места для хранения строки данных.When the Компонент SQL Server Database EngineSQL 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. Используя IAM-страницы, компонент Компонент SQL Server Database EngineSQL Server Database Engine находит экстенты, привязанные к единице распределения.The Компонент SQL Server Database EngineSQL Server Database Engine uses the IAM pages to find the extents allocated to the allocation unit. Для каждого экстента компонент Компонент SQL Server Database EngineSQL Server Database Engine просматривает PFS-страницы, чтобы определить наличие доступных страниц.For each extent, the Компонент SQL Server Database EngineSQL Server Database Engine searches the PFS pages to see if there is a page that can be used. Огромное число страниц данных содержатся в сравнительно небольшом числе IAM- и PFS-страниц.Each IAM and PFS page covers lots of data pages, so there are few IAM and PFS pages in a database. Поэтому обычно IAM- и PFS-страницы находятся в памяти буферного пула SQL ServerSQL Server, и поиск в них осуществляется очень быстро.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. Для индексов точка вставки новой строки определяется ключом индекса, но если нужна новая страница, происходит описанный выше процесс.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.

Компонент Компонент SQL Server Database EngineSQL Server Database Engine размещает новый экстент для единицы распределения только в том случае, когда в существующем экстенте невозможно быстро найти страницу, в которой достаточно места для вставляемой строки.The Компонент SQL Server Database EngineSQL 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.

Компонент SQL Server Database EngineSQL Server Database Engine распределяет экстенты для файловой группы, используя алгоритм распределения с пропорциональным заполнением.The Компонент SQL Server Database EngineSQL Server Database Engine allocates extents from those available in the filegroup using a proportional fill allocation algorithm. Если файловая группа состоит из двух файлов и в одном из них свободного места вдвое больше, чем в другом, то во втором файле будет размещаться по одной странице на каждые две страницы в первом.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. Это означает, что процент заполнения для каждого из файлов в группе будет примерно одинаковым.This means that every file in a filegroup should have a similar percentage of space used.

Отслеживание измененных экстентовTracking Modified Extents

SQL ServerSQL Server использует две структуры внутренних данных, чтобы отслеживать экстенты, измененные операциями массового копирования, и экстенты, измененные со времени последнего полного резервного копирования.uses two internal data structures to track extents modified by bulk copy operations and extents modified since the last full backup. Эти структуры данных существенно ускоряют разностные резервные копии.These data structures greatly speed up differential backups. Они также ускоряют операции записи в журнал массового копирования, если база данных использует модель восстановления с неполным протоколированием.They also speed up the logging of bulk copy operations when a database is using the bulk-logged recovery model. Подобно страницам глобальной карты распределения (GAM) и общей общей глобальной карты распределения (SGAM), эти структуры являются битовыми картами, в которых каждый бит представляет один экстент.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.

  • Схема разностных изменений (Differential Changed Map, DCM) Differential Changed Map (DCM)
    Эта схема отслеживает экстенты, которые были изменены со времени последнего выполнения инструкции BACKUP DATABASE.This tracks the extents that have changed since the last BACKUP DATABASE statement. Если бит экстента равен 1, с момента последнего выполнения BACKUP DATABASE экстент был изменен.If the bit for an extent is 1, the extent has been modified since the last BACKUP DATABASE statement. Если бит равен 0, то экстент не был изменен.If the bit is 0, the extent has not been modified. Чтобы определить, какие экстенты были изменены, разностные резервные копии считывают только страницы DCM.Differential backups read just the DCM pages to determine which extents have been modified. Это существенно сокращает количество страниц, которые должна просмотреть разностная резервная копия.This greatly reduces the number of pages that a differential backup must scan. Количество времени, которое затрачивает разностная резервная копия, пропорционально количеству экстентов, измененных со времени последнего выполнения инструкции BACKUP DATABASE, а не размеру всей базы данных.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.

  • Схема массовых изменений (Bulk Changed Map, BCM) Bulk Changed Map (BCM)
    Эта схема отслеживает экстенты, измененные операциями с неполным протоколированием со времени последнего выполнения инструкции BACKUP LOG.This tracks the extents that have been modified by bulk logged operations since the last BACKUP LOG statement. Если бит экстента равен 1, после последнего выполнения 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. Если бит равен 0, то экстент не был изменен операциями с неполным протоколированием.If the bit is 0, the extent has not been modified by bulk logged operations. Несмотря на то, что страницы BCM существуют во всех базах данных, они соответствуют только в том случае, если база данных использует модель восстановления с неполным протоколированием.Although BCM pages appear in all databases, they are only relevant when the database is using the bulk-logged recovery model. В этой модели восстановления при выполнении инструкции BACKUP LOG процесс резервного копирования проверяет схемы BCM на наличие измененных экстентов.In this recovery model, when a BACKUP LOG is performed, the backup process scans the BCMs for extents that have been modified. Затем она включает в себя экстенты из резервной копии журнала.It then includes those extents in the log backup. Это позволяет восстановиться операциям с неполным протоколированием, если база данных восстанавливается из резервной копии журнала и последовательности резервных копий журнала транзакции.This lets the bulk logged operations be recovered if the database is restored from a database backup and a sequence of transaction log backups. Страницы BCM в базе данных, которая использует простую модель восстановления, не соответствуют, потому что не произведена запись в журнал ни одной операции с неполным протоколированием.BCM pages are not relevant in a database that is using the simple recovery model, because no bulk logged operations are logged. Они не соответствуют базе данных, которая использует модель полного восстановления, потому что эта модель восстановления принимает операции с неполным протоколированием за операции с полным протоколированием.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.

Интервал между DCM- и BCM-страницами равен интервалу между GAM- и SGAM-страницами — 64 000 экстентов.The interval between DCM pages and BCM pages is the same as the interval between GAM and SGAM page, 64,000 extents. DCM- и BCM-страницы расположены за GAM- и SGAM-страницами в физическом файле:The DCM and BCM pages are located behind the GAM and SGAM pages in a physical file:

special_page_order

См. также:See Also

sys.allocation_units (Transact-SQL) sys.allocation_units (Transact-SQL)
Кучи (таблицы без кластеризованных индексов) Heaps (Tables without Clustered Indexes)
Считывание страниц Reading Pages
Запись страницWriting Pages