Handbuch zur Architektur von Seiten und BlöckenPages and Extents Architecture Guide

GILT FÜR: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL Data Warehouse) JaParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database YesAzure Synapse Analytics (SQL Data Warehouse) YesParallel Data Warehouse

Die Seite ist die grundlegende Einheit für die Datenspeicherung in SQL ServerSQL Server.The page is the fundamental unit of data storage in SQL ServerSQL Server. Ein Block ist eine Auflistung von acht physisch zusammenhängenden Seiten.An extent is a collection of eight physically contiguous pages. Blöcke tragen zu einer effizienten Verwaltung von Seiten bei.Extents help efficiently manage pages. In diesem Handbuch werden die Datenstrukturen beschrieben, die zum Verwalten von Seiten und Blöcken in allen Versionen von SQL Server verwendet werden.This guide describes the data structures that are used to manage pages and extents in all versions of SQL Server. Kenntnisse der Architektur von Seiten und Blöcken sind Voraussetzung für das Entwerfen und Entwickeln von effizienten Datenbanken.Understanding the architecture of pages and extents is important for designing and developing databases that perform efficiently.

Seiten und BlöckePages and Extents

Die grundlegende Einheit für die Datenspeicherung in SQL ServerSQL Server ist die Seite.The fundamental unit of data storage in SQL ServerSQL Server is the page. Der Speicherplatz, der einer Datendatei (MDF- oder NDF-Datei) in einer Datenbank zugeordnet wird, ist logisch in Seiten unterteilt, die fortlaufend von 0 bis n nummeriert sind.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. Datenträger-E/A-Operationen werden auf Seitenebene ausgeführt.Disk I/O operations are performed at the page level. Dies bedeutet, dass SQL Server ganze Datenseiten liest oder schreibt.That is, SQL Server reads or writes whole data pages.

Blöcke sind Auflistungen von acht physisch zusammenhängenden Seiten; sie werden zum effizienten Verwalten der Seiten verwendet.Extents are a collection of eight physically contiguous pages and are used to efficiently manage the pages. Alle Seiten sind in Blöcke unterteilt.All pages are organized into extents.

SeitenPages

Wenn Sie ein normales Buch in die Hand nehmen, dann ist der gesamte Inhalt auf Seiten geschrieben.Take a regular book: all content in it is written on pages. Ähnlich wie bei einem Buch sind auch die Datenzeilen in SQL Server auf Seiten geschrieben.Similar to a book, in SQL Server all the data rows are written on pages. Bei einem Buch sind alle Seiten gleich groß.In a book, all pages are the same physical size. Bei SQL Server haben alle Datenseiten ebenso dieselbe Größe: 8 Kilobyte.Similarly, in SQL Server all data pages are the same size - 8 kilobytes. In einem Buch enthalten die meisten Seiten die Daten, also den Hauptinhalt des Buchs, und einige Seiten enthalten Metadaten über den Inhalt, also z. B. das Inhaltsverzeichnis und der Index.In a book most pages contain the data - the main content of the book - and some pages contain metadata about the content - for example table of contents and index. SQL Server unterscheidet sich nicht sehr davon: die meisten Seiten enthalten die tatsächlichen Datenzeilen, die von Benutzer gespeichert wurden. Diese Seiten werden Datenseiten und Text-/Bildseiten (in Sonderfällen) genannt.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). Die Indexseiten enthalten Indexverweise darüber, wo die Daten zu finden sind. Dann gibt es noch Systemseiten, die eine Vielzahl von Metadaten über die Organisation der Daten speichern (PFS-, GAM-, SGAM-, IAM-, DCM-, BCM--Seiten).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). In der Tabelle unten erhalten Sie Informationen zu Seitentypen sowie deren Beschreibung.See table below for page types and their description.

Wie bereits erwähnt, beträgt in SQL ServerSQL Server die Seitengröße 8 KB.As mentioned, in SQL ServerSQL Server, the page size is 8-KB. Dies bedeutet, dass SQL ServerSQL Server-Datenbanken über 128 Seiten pro 1 MB verfügen.This means SQL ServerSQL Server databases have 128 pages per megabyte. Jede Seite beginnt mit einem 96 Byte umfassenden Header, der zum Speichern von Systeminformationen zu der betreffenden Seite verwendet wird.Each page begins with a 96-byte header that is used to store system information about the page. Diese Informationen umfassen die Seitennummer, den Typ der Seite, den Umfang des freien Speicherplatzes auf der Seite und die ID der Zuordnungseinheit, die Besitzer der Seite ist.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.

Die folgende Tabelle zeigt die Seitentypen, die in Datendateien einer SQL ServerSQL Server-Datenbank verwendet werden.The following table shows the page types used in the data files of a SQL ServerSQL Server database.

SeitentypPage type ContentsContents
DataData Datenzeilen mit allen Daten, ausgenommen Daten der Typen text, ntext, image, nvarchar(max), varchar(max), varbinary(max) und xml, wenn „text in row“ auf ON festgelegt wurde.Data rows with all data, except text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data, when text in row is set to ON.
IndexIndex IndexeinträgeIndex entries.
Text/ImageText/Image LOB-Datentypen (Large Object): (text, ntext, image, nvarchar(max), varchar(max), varbinary(max) und xml)Large object data types: (text, ntext, image, nvarchar(max), varchar(max), varbinary(max), and xml data)
Spalten variabler Länge, wenn die Datenzeile 8 KB übersteigt: (varchar, nvarchar, varbinary und 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 Informationen dazu, ob Blöcke zugeordnet sind.Information about whether extents are allocated.
Page Free Space (PFS)Page Free Space (PFS) Informationen zur Seitenzuordnung sowie zum freien Speicherplatz, der auf Seiten verfügbar ist.Information about page allocation and free space available on pages.
Index Allocation Map (IAM)Index Allocation Map Informationen zu Blöcken, die von einer Tabelle oder einem Index pro Zuordnungseinheit verwendet werden.Information about extents used by a table or index per allocation unit.
Bulk Changed MapBulk Changed Map Informationen zu Blöcken, die seit der letzten Ausführung der BACKUP LOG-Anweisung pro Zuordnungseinheit durch Massenvorgänge geändert wurden.Information about extents modified by bulk operations since the last BACKUP LOG statement per allocation unit.
Differential Changed MapDifferential Changed Map Informationen zu Blöcken, die seit der letzten Ausführung der BACKUP DATABASE-Anweisung pro Zuordnungseinheit geändert wurden.Information about extents that have changed since the last BACKUP DATABASE statement per allocation unit.

Hinweis

Protokolldateien enthalten keine Seiten; sie enthalten eine Folge von Protokolldatensätze.Log files do not contain pages; they contain a series of log records.

Datenzeilen werden unmittelbar nach dem Header nacheinander auf der Seite gespeichert.Data rows are put on the page serially, starting immediately after the header. Eine Zeilenoffsettabelle beginnt am Ende der Seite, und jede Zeilenoffsettabelle enthält einen Eintrag für jede Zeile auf der Seite.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. Jeder dieser Zeilenoffseteinträge zeichnet auf, wie weit das erste Byte der Zeile vom Beginn der Seite entfernt ist.Each row offset entry records how far the first byte of the row is from the start of the page. Die Funktion einer Zeilenoffsettabelle besteht also darin, Zeilen auf einer Seite sehr schnell zu finden.Thus, the function of the row offset table is to help SQL Server locate rows on a page very quickly. Die Einträge in der Zeilenoffsettabelle befinden sich in umgekehrter Reihenfolge zur Reihenfolge der Zeilen auf der Seite.The entries in the row offset table are in reverse sequence from the sequence of the rows on the page.

page_architecture

Unterstützung von umfangreichen ZeilenLarge Row Support

Zeilen können sich nicht über mehrere Seiten erstrecken, Teile der Zeile können jedoch von der Seite der Zeile verschoben werden; die Zeile kann auf diese Weise sehr umfangreich sein.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. Die maximale Menge an Daten und Overhead, die in einer einzelnen Zeile auf einer Seite enthalten sein können, beträgt 8.060 Byte (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). Dies schließt jedoch nicht die Daten ein, die im Text/Image-Seitentyp gespeichert werden.However, this does not include the data stored in the Text/Image page type.

Diese Einschränkung wurde für Tabellen gelockert, die varchar-, nvarchar-, varbinary- oder sql_variant-Spalten enthalten.This restriction is relaxed for tables that contain varchar, nvarchar, varbinary, or sql_variant columns. Wenn die Gesamtzeilengröße aller festen und variablen Spalten in einer Tabelle den Grenzwert von 8.060 Bytes übersteigt, verschiebt SQL ServerSQL Server eine oder mehrere Spalten variabler Länge dynamisch auf Seiten in der ROW_OVERFLOW_DATA-Zuordnungseinheit. Dabei wird mit der Spalte mit der größten Breite begonnen.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.

Dieser Vorgang wird immer ausgeführt, wenn die Gesamtgröße der Zeile durch einen Einfüge- oder Updatevorgang den Maximalwert von 8.060 Byte übersteigt.This is done whenever an insert or update operation increases the total size of the row beyond the 8,060-byte limit. Wenn eine Spalte auf eine Seite in der ROW_OVERFLOW_DATA-Zuordnungseinheit verschoben wird, wird ein 24-Byte-Zeiger auf die ursprüngliche Seite in der IN_ROW_DATA-Zuordnungseinheit verwaltet.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. Falls eine nachfolgende Operation die Spaltengröße verringert, verschiebt SQL ServerSQL Server die Spalten dynamisch zurück auf die ursprüngliche Datenseite.If a subsequent operation reduces the row size, SQL ServerSQL Server dynamically moves the columns back to the original data page.

Überlegungen zum ZeilenüberlaufRow-Overflow Considerations

Wie bereits erwähnt, darf sich eine Zeile nicht auf mehreren Seiten befinden, da bei Überschreiten des Grenzwerts von 8.060 Bytes für die Gesamtgröße der Datentypfelder mit variabler Länger ein Überlauf erzeugt werden kann.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. Dies kann anhand einer Tabelle mit zwei Spalten veranschaulicht werden: Eine Spalte besitzt varchar (7000), die andere varchar (2000).To illustrate, a table may be created with two columns: one varchar(7000) and another varchar (2000). Einzeln ist keine der beiden Spalten größer als 8.060 Bytes. Doch zusammengenommen könnten sie den Wert überschreiten, wenn die gesamte Breite beider Spalten ausgefüllt ist.Individually neither column exceeds the 8060-byte, but combined they could do so, if the entire width of each column is filled. SQL Server kann die Spalte mit variabler Länge von varchar (7000) dynamisch auf Seiten der Zuordnungseinheit ROW_OVERFLOW_DATA verschieben.SQL Server may dynamically move the varchar(7000) variable length column to pages in the ROW_OVERFLOW_DATA allocation unit. Wenn Sie Spalten der Datentypen „varchar“, „nvarchar“, „nvarchar“, „sql_variant“ oder Spalten mit CLR-benutzerdefinierten Datentypen miteinander kombinieren, die pro Zeile 8.060 Bytes überschreiten, muss Folgendes berücksichtigt werden:When you combine varchar, nvarchar, varbinary, sql_variant, or CLR user-defined type columns that exceed 8,060 bytes per row, consider the following:

  • Das Verschieben großer Datensätze zu einer anderen Seite geschieht dynamisch, wenn die Datensätze im Ergebnis von Updatevorgängen verlängert wurden.Moving large records to another page occurs dynamically as records are lengthened based on update operations. Updatevorgänge, die zu einer Verkürzung von Datensätzen führen, können hingegen bewirken, dass Datensätze wieder zurück zur ursprünglichen Seite in der IN_ROW_DATA-Zuordnungseinheit verschoben werden.Update operations that shorten records may cause records to be moved back to the original page in the IN_ROW_DATA allocation unit. Abfragen und andere Auswahlvorgänge, wie z. B. Sortierungen oder Joins von großen Datensätzen mit Daten, bei denen Zeilenüberlauf vorkommt, bewirken eine Herabsetzung der Verarbeitungsgeschwindigkeit, weil diese Datensätze nicht asynchron, sondern synchron verarbeitet werden.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.
    Deshalb sollten Sie beim Entwerfen einer Tabelle mit mehreren Spalten der Datentypen „varchar“, „nvarchar“, „varbinary“, „sql_variant“ oder mit CLR-benutzerdefinierten Datentypen auf den Prozentsatz der Zeilen achten, bei denen es wahrscheinlich zum Überlauf kommt. Außerdem sollten Sie die Häufigkeit berücksichtigen, mit der diese Überlaufdaten wahrscheinlich abgefragt werden.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. Wenn es wahrscheinlich häufig zu Abfragen von vielen Zeilen mit überlaufenden Daten kommt, sollten Sie eine Normalisierung der Tabelle in Betracht ziehen, damit einige Spalten in eine andere Tabelle verschoben werden.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. Diese können dann in einer asynchronen JOIN-Operation abgefragt werden.This can then be queried in an asynchronous JOIN operation.
  • Die Länge der einzelnen Spalten muss bei den Datentypen „varchar“, „nvarchar“, „varbinary“, „sql_variant“ und CLR-benutzerdefinierten Datentypen weiterhin innerhalb des 8.000-Byte-Limits liegen.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. Lediglich ihre kombinierten Längen dürfen das Zeilenlimit von 8.060 Byte einer Tabelle überschreiten.Only their combined lengths can exceed the 8,060-byte row limit of a table.
  • Die Summe der Spalten mit anderen Datentypen, wie „char“- und „nchar“-Daten, dürfen das Zeilenlimit von 8.060 Byte nicht übersteigen.The sum of other data type columns, including char and nchar data, must fall within the 8,060-byte row limit. Große Objektdaten sind ebenfalls vom 8.060-Byte-Zeilenlimit ausgenommen.Large object data is also exempt from the 8,060-byte row limit.
  • Der Indexschlüssel eines gruppierten Indexes kann keine Spalten des Datentyps „varchar“ enthalten, bei denen Daten in der Zuordnungseinheit ROW_OVERFLOW_DATA vorhanden sind.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. Wird ein gruppierter Index für eine „varchar“-Spalte erstellt, bei der in der Zuordnungseinheit IN_ROW_DATA Daten vorhanden sind, erzeugen alle nachfolgenden Einfügungen und Updates der Spalte einen Fehler, bei der diese Daten aus der Zeile entfernt werden.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. Weitere Informationen zu Zuordnungseinheiten finden Sie unter „Organisationsstruktur von Tabellen und Indizes“.For more information about allocation units, see Table and Index Organization.
  • Sie können Spalten, die Daten mit Zeilenüberlauf enthalten, als Schlüssel- oder Nichtschlüsselspalten eines nicht gruppierten Index einbeziehen.You can include columns that contain row-overflow data as key or nonkey columns of a nonclustered index.
  • Die Datensatzgrößenbeschränkung für Tabellen, die Sparsespalten verwenden, beträgt 8.018 Byte.The record-size limit for tables that use sparse columns is 8,018 bytes. Wenn die konvertierten Daten zusammen mit den vorhandenen Datensatzdaten 8.018 Byte überschreiten, wird MSSQLSERVER ERROR 576 zurückgegeben.When the converted data plus existing record data exceeds 8,018 bytes, MSSQLSERVER ERROR 576 is returned. Wenn Spalten zwischen Typen mit geringer Dichte und anderen Typen konvertiert werden, behält die Datenbank-Engine eine Kopie der aktuellen Datensatzdaten bei.When columns are converted between sparse and nonsparse types, Database Engine keeps a copy of the current record data. Dies verdoppelt vorübergehend den Speicher, der für den Datensatz erforderlich ist.This temporarily doubles the storage that is required for the record.
  • Zum Abrufen von Informationen zu Tabellen oder Indizes, die ggf. Daten mit Zeilenüberlauf enthalten, verwenden Sie die dynamische Verwaltungsfunktion 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

Blöcke sind die Grundeinheit, in der Speicherplatz verwaltet wird.Extents are the basic unit in which space is managed. Ein Block umfasst acht zusammenhängende Seiten, also 64 KB.An extent is eight physically contiguous pages, or 64 KB. Dies bedeutet, dass SQL Server-Datenbanken über 16 Blöcke pro 1 MB verfügen.This means SQL Server databases have 16 extents per megabyte.

SQL ServerSQL Server verfügt über zwei Arten von Blöcken:has two types of extents:

  • Einheitliche Blöcke befinden sich im Besitz eines einzigen Objekts; alle acht Seiten in dem Block können nur vom besitzenden Objekt verwendet werden.Uniform extents are owned by a single object; all eight pages in the extent can only be used by the owning object.
  • Gemischte Blöcke werden für bis zu acht Objekte freigegeben.Mixed extents are shared by up to eight objects. Jede der acht Seiten im Block kann im Besitz eines anderen Objekts sein.Each of the eight pages in the extent can be owned by a different object.

Bis einschließlich SQL Server 2014 (12.x)SQL Server 2014 (12.x) ordnet SQL ServerSQL Server Tabellen, die nur wenige Daten enthalten, keine ganzen Blöcke zu.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. Für eine neue Tabelle oder einen neuen Index werden normalerweise Seiten aus gemischten Blöcken zugewiesen.A new table or index generally allocates pages from mixed extents. Wenn eine Tabelle oder ein Index so groß geworden ist, dass sie bzw. er acht Seiten umfasst, werden bei nachfolgenden Zuweisungen einheitliche Blöcke zugewiesen.When the table or index grows to the point that it has eight pages, it then switches to use uniform extents for subsequent allocations. Wenn Sie einen Index für eine vorhandene Tabelle erstellen, die über genügend Zeilen verfügt, um acht Seiten im Index zu generieren, erfolgen alle Zuweisungen für den Index in Form von einheitlichen Blöcken.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. Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) jedoch sind einheitliche Blöcke der Standard für alle Zuordnungen in der Datenbank.However, starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the default for all allocations in the database is uniform extents.

Extents

Hinweis

Bis einschließlich SQL Server 2014 (12.x)SQL Server 2014 (12.x) kann das Ablaufverfolgungsflag 1118 verwendet werden, um die Standardzuordnung so zu ändern, dass immer einheitliche Blöcke verwendet werden.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. Weitere Informationen zu diesem Ablaufverfolgungsflag finden Sie unter DBCC TRACEON – Trace Flags.For more information about this trace flag, see DBCC TRACEON - Trace Flags.

Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) wird die Funktionalität, die vom Ablaufverfolgungsflag 1118 bereitgestellt wird, für tempdb automatisch aktiviert.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the functionality provided by TF 1118 is automatically enabled for TempDB. Für Benutzerdatenbanken wird dieses Verhalten durch die SET MIXED_PAGE_ALLOCATION-Option von ALTER DATABASE gesteuert. Der Standardwert ist auf OFF festgelegt, und das Ablaufverfolgungsflag 1118 hat keine Auswirkungen.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. Weitere Informationen finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL).For more information, see ALTER DATABASE SET Options (Transact-SQL).

Verwalten von Blockzuordnungen und freiem SpeicherplatzManaging Extent Allocations and Free Space

Die SQL ServerSQL Server-Datenstrukturen, die Blockzuordnungen verwalten und freien Speicherplatz nachverfolgen, weisen eine relativ einfache Struktur auf.The SQL ServerSQL Server data structures that manage extent allocations and track free space have a relatively simple structure. Das hat folgende Vorteile:This has the following benefits:

  • Die Informationen zum freien Speicherplatz sind dicht gepackt, sodass nur relativ wenig Seiten benötigt werden, um diese Informationen aufzunehmen.The free space information is densely packed, so relatively few pages contain this information.
    Auf diese Weise wird die Geschwindigkeit erhöht, da die Anzahl der Lesevorgänge vom Datenträger reduziert wird, die erforderlich sind, um Zuordnungsinformationen abzurufen.This increases speed by reducing the amount of disk reads that are required to retrieve allocation information. Hierdurch wird auch die Wahrscheinlichkeit erhöht, dass die Zuordnungsseiten im Arbeitsspeicher verbleiben und somit keine weiteren Lesevorgänge erforderlich sind.This also increases the chance that the allocation pages will remain in memory and not require more reads.

  • Der größte Teil der Zuordnungsinformationen ist nicht miteinander verkettet.Most of the allocation information is not chained together. Hierdurch wird die Verwaltung der Zuordnungsinformationen vereinfacht.This simplifies the maintenance of the allocation information.
    Das Zuordnen oder Aufheben der Zuordnung der einzelnen Seiten kann sehr schnell erfolgen.Each page allocation or deallocation can be performed quickly. So wird die Anzahl der Konflikte zwischen gleichzeitig ausgeführten Tasks reduziert, die Seiten zuordnen oder die Zuordnung von Seiten aufheben müssen.This decreases the contention between concurrent tasks having to allocate or deallocate pages.

Verwalten von BlockzuordnungenManaging Extent Allocations

SQL ServerSQL Server verwendet zwei Arten von Zuordnungstabellen, um die Zuordnung von Blöcken zu erfassen:uses two types of allocation maps to record the allocation of extents:

  • Global Allocation Map (GAM) Global Allocation Map (GAM)
    GAM-Seiten zeichnen auf, welche Blöcke zugeordnet wurden.GAM pages record what extents have been allocated. Jede GAM erfasst 64.000 Blöcke, was fast 4 GB an Daten entspricht.Each GAM covers 64,000 extents, or almost 4 gigabytes (GB) of data. Die GAM verfügt über ein Bit für jeden Block in dem von ihr abgedeckten Intervall.The GAM has 1-bit for each extent in the interval it covers. Hat das Bit den Wert 1, ist der Block frei; hat das Bit den Wert 0, ist der Block zugeordnet.If the bit is 1, the extent is free; if the bit is 0, the extent is allocated.

  • Shared Global Allocation Map (SGAM) Shared Global Allocation Map (SGAM)
    SGAM-Seiten zeichnen auf, welche Blöcke zurzeit als gemischte Blöcke verwendet werden und über mindestens eine nicht verwendete Seite verfügen.SGAM pages record which extents are currently being used as mixed extents and also have at least one unused page. Jede SGAM erfasst 64.000 Blöcke, was fast 4 GB an Daten entspricht.Each SGAM covers 64,000 extents, or almost 4-GB of data. Die SGAM verfügt über ein Bit für jeden Block in dem von ihr abgedeckten Intervall.The SGAM has 1-bit for each extent in the interval it covers. Wenn das Bit den Wert 1 hat, wird der Block als gemischter Block verwendet und verfügt über eine freie Seite.If the bit is 1, the extent is being used as a mixed extent and has a free page. Wenn das Bit den Wert 0 hat, wird der Block nicht als gemischter Block verwendet, oder er wird als gemischter Block verwendet, aber alle seine Seiten werden verwendet.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.

Für jeden Block wird auf der Grundlage der aktuellen Verwendung eines der folgenden Bitmuster in der GAM oder der SGAM festgelegt.Each extent has the following bit patterns set in the GAM and SGAM, based on its current use.

Aktuelle BlockverwendungCurrent use of extent GAM-BiteinstellungGAM bit setting SGAM-BiteinstellungSGAM bit setting
Frei, wird nicht verwendetFree, not being used 11 00
Einheitlicher Block oder vollständig belegter gemischter BlockUniform extent, or full mixed extent 00 00
Gemischter Block mit freien SeitenMixed extent with free pages 00 11

Dies führt zu einfachen Algorithmen für die Blockverwaltung.This causes simple extent management algorithms.

  • Um einen einheitlichen Block zuzuweisen, durchsucht SQL Server-Datenbank-EngineSQL Server Database Engine die GAM nach einem Bit mit dem Wert 1 und legt es auf 0 fest.To allocate a uniform extent, the SQL Server-Datenbank-EngineSQL Server Database Engine searches the GAM for a 1 bit and sets it to 0.
  • Um einen gemischten Block mit freien Seiten zu finden, durchsucht SQL Server-Datenbank-EngineSQL Server Database Engine die SGAM nach einem Bit mit dem Wert 1.To find a mixed extent with free pages, the SQL Server-Datenbank-EngineSQL Server Database Engine searches the SGAM for a 1 bit.
  • Um einen einheitlichen Block zuzuordnen, durchsucht SQL Server-Datenbank-EngineSQL Server Database Engine die GAM nach einem Bit mit dem Wert 1 und legt es auf 0 fest. Anschließend wird der entsprechende Wert in der SGAM auf 1 festgelegt.To allocate a mixed extent, the SQL Server-Datenbank-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.
  • Um einen Block freizugeben, stellt SQL Server-Datenbank-EngineSQL Server Database Engine sicher, dass das GAM-Bit auf 1 und das SGAM-Bit auf 0 festgelegt wird.To deallocate an extent, the SQL Server-Datenbank-EngineSQL Server Database Engine makes sure that the GAM bit is set to 1 and the SGAM bit is set to 0. Die Algorithmen, die von SQL Server-Datenbank-EngineSQL Server Database Engine tatsächlich intern verwendet werden, sind komplexer als in diesem Artikel beschrieben, da SQL Server-Datenbank-EngineSQL Server Database Engine Daten gleichmäßig in der Datenbank verteilt.The algorithms that are actually used internally by the SQL Server-Datenbank-EngineSQL Server Database Engine are more sophisticated than what is described in this article, because the SQL Server-Datenbank-EngineSQL Server Database Engine distributes data evenly in a database. Aber auch die wirklich verwendeten Algorithmen konnten vereinfacht werden, da nunmehr keine verketteten Blockzuordnungsinformationen verwaltet werden müssen.However, even the real algorithms are simplified by not having to manage chains of extent allocation information.

Nachverfolgen von freiem SpeicherplatzTracking free space

PFS-Seiten (Page Free Space) zeichnen den Zuordnungsstatus der einzelnen Seiten auf, ob eine einzelne Seite zugeordnet wurde und die Menge des freien Speicherplatzes für die einzelnen Seiten.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. Der freie Speicherplatz verfügt über ein Byte pro Seite und zeichnet auf, ob die Seite zugeordnet ist. Wenn dies der Fall ist, wird auch aufgezeichnet, ob sie leer oder bis zu einem bestimmten Prozentsatz voll ist: 1 bis 50 Prozent, 51 bis 80 Prozent, 81 bis 95 Prozent oder 96 bis 100 Prozent.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.

Nachdem ein Block einem Objekt zugeordnet wurde, verwendet SQL Server-Datenbank-EngineSQL Server Database Engine die PFS-Seiten, um aufzuzeichnen, welche Seiten in dem jeweiligen Block zugeordnet und welche Seiten frei sind.After an extent has been allocated to an object, the SQL Server-Datenbank-EngineSQL Server Database Engine uses the PFS pages to record which pages in the extent are allocated or free. Diese Informationen werden verwendet, wenn SQL Server-Datenbank-EngineSQL Server Database Engine eine neue Seite zuordnen muss.This information is used when the SQL Server-Datenbank-EngineSQL Server Database Engine has to allocate a new page. Die Menge des freien Speicherplatzes auf einer Seite wird nur für Heap- und Text/Image-Seiten verwaltet.The amount of free space in a page is only maintained for heap and Text/Image pages. Diese Information wird verwendet, wenn SQL Server-Datenbank-EngineSQL Server Database Engine eine Seite mit verfügbarem freien Speicherplatz sucht, um eine neu eingefügte Zeile aufzunehmen.It is used when the SQL Server-Datenbank-EngineSQL Server Database Engine has to find a page with free space available to hold a newly inserted row. Indizes erfordern nicht, dass der Page Free Space nachverfolgt werden soll, da die Stelle, an der eine neue Zeile eingefügt werden soll, von den Indexschlüsselwerten festgelegt wird.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.

In der Datendatei wird für jeden zusätzlichen Bereich, der nachverfolgt wird, eine neue PFS-, GAM- oder SGAM-Seite hinzugefügt.A new PFS, GAM or SGAM page is added in the data file for every additional range that it keeps track of. Nach der ersten PFS-Seite folgt also alle 8.088 Seiten eine neue PFS-Seite.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. So stellen also die Seiten mit Seiten-ID 1, Seiten-ID 8088 und Seiten-ID 16176 PFS-Seiten dar.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. Nach der ersten GAM-Seite folgt jeweils im Abstand von 64.000 Blöcken eine neue GAM-Seite, die die nächsten 64.000 Blöcke nachverfolgt.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. Dementsprechend folgt nach der ersten SGAM-Seite im Abstand von 64.000 Blöcken jeweils eine neue SGAM-Seite.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. Folgende Abbildung veranschaulicht die Abfolge der Seiten, die von SQL Server-Datenbank-EngineSQL Server Database Engine für das Zuordnen und Verwalten von Blöcken verwendet werden.The following illustration shows the sequence of pages used by the SQL Server-Datenbank-EngineSQL Server Database Engine to allocate and manage extents.

manage_extents

Verwalten des von Objekten belegten SpeicherplatzesManaging space used by objects

Eine IAM-Seite (Index Allocation Map) ordnet die Blöcke in einem 4-GB-Teil einer Datenbankdatei zu, die von einer Zuordnungseinheit verwendet wird.An Index Allocation Map (IAM) page maps the extents in a 4-GB part of a database file used by an allocation unit. Eine Zuordnungseinheit entspricht einem von drei möglichen Typen:An allocation unit is one of three types:

  • IN_ROW_DATAIN_ROW_DATA
    Enthält eine Partition eines Heap oder eines Index.Holds a partition of a heap or index.

  • LOB_DATALOB_DATA
    Enthält LOB-Datentypen (Large Object) wie xml, varbinary(max) und varchar(max).Holds large object (LOB) data types, such as xml, varbinary(max), and varchar(max).

  • ROW_OVERFLOW_DATAROW_OVERFLOW_DATA
    Enthält Daten variabler Länge, die in varchar-, nvarchar-, varbinary- oder sql_variant-Spalten gespeichert sind, die das Zeilengrößenlimit von 8.060 Bytes überschreiten.Holds variable length data stored in varchar, nvarchar, varbinary, or sql_variant columns that exceed the 8,060 byte row size limit.

Jede Partition eines Heap oder Index enthält mindestens eine IN_ROW_DATA-Zuordnungseinheit.Each partition of a heap or index contains at least an IN_ROW_DATA allocation unit. Sie kann je nach dem Heap- oder Indexschema auch eine LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheit enthalten.It may also contain a LOB_DATA or ROW_OVERFLOW_DATA allocation unit, depending on the heap or index schema.

Eine IAM-Seite deckt einen 4-GB-Bereich in einer Datei ab und besitzt dieselbe Erfassung wie eine GAM- oder SGAM-Seite.An IAM page covers a 4-GB range in a file and is the same coverage as a GAM or SGAM page. Wenn die Zuordnungseinheit Blöcke mehrerer Dateien oder mehrere 4-GB-Bereiche einer Datei enthält, werden mehrere IAM-Seiten zu einer IAM-Kette verknüpft.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. Deshalb hat jede Zuordnungseinheit mindestens eine IAM-Seite für jede Datei, aus der sie Blöcke enthält.Therefore, each allocation unit has at least one IAM page for each file on which it has extents. Es kann auch mehrere IAM-Seiten für eine Datei geben, wenn der Bereich der Blöcke aus der Datei, die für die Zuordnungseinheit zugeordnet ist, den Bereich übersteigt, den eine einzelne IAM-Seite aufzeichnen kann.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-Seiten werden je nach Bedarf für jede Zuordnungseinheit zugeordnet und nach dem Zufallsprinzip in der Datei verteilt.IAM pages are allocated as required for each allocation unit and are located randomly in the file. Die Systemsicht „sys.system_internals_allocation_units“ verweist auf die erste IAM-Seite für eine Zuordnungseinheit.The system view, sys.system_internals_allocation_units, points to the first IAM page for an allocation unit. Alle IAM-Seiten für diese Zuordnungseinheit werden in einer Kette miteinander verknüpft.All the IAM pages for that allocation unit are linked in a chain.

Wichtig

Die Systemsicht sys.system_internals_allocation_units ist nur zur internen Verwendung bestimmt und kann geändert werden.The sys.system_internals_allocation_units system view is for internal use only and is subject to change. Kompatibilität wird nicht sichergestellt.Compatibility is not guaranteed.

iam_chain

Pro Zuordnungseinheit in einer Kette verknüpfte IAM-Seiten. Eine IAM-Seite verfügt über einen Header, der den Anfangsblock des Bereichs von Blöcken kennzeichnet, die von der IAM-Seite zugeordnet werden.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. Die IAM-Seite verfügt darüber hinaus über ein großes Bitmuster, in dem jedes Bit einen Block darstellt.The IAM page also has a large bitmap in which each bit represents one extent. Das erste Bit in dem Bitmuster stellt den ersten Block im Bereich dar, das zweite Bit stellt den zweiten Block dar usw.The first bit in the map represents the first extent in the range, the second bit represents the second extent, and so on. Wenn ein Bit den Wert 0 hat, ist der Block, den es darstellt, nicht für die Zuordnungseinheit zugeordnet, die die IAM besitzt.If a bit is 0, the extent it represents is not allocated to the allocation unit owning the IAM. Wenn das Bit den Wert 1 hat, ist der Block, den es darstellt, für die Zuordnungseinheit zugeordnet, die die IAM-Seite besitzt.If the bit is 1, the extent it represents is allocated to the allocation unit owning the IAM page.

Wenn von SQL Server-Datenbank-EngineSQL Server Database Engine eine neue Zeile eingefügt werden muss und auf der aktuellen Seite kein Speicherplatz verfügbar ist, werden die IAM- und PFS-Seiten verwendet, um eine zuzuordnende Seite zu finden oder – bei einem Heap oder einer Text-/Image-Seite – um eine Seite mit ausreichend Platz zur Aufnahme der Zeile zu finden.When the SQL Server-Datenbank-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. SQL Server-Datenbank-EngineSQL Server Database Engine verwendet IAM-Seiten, um die Blöcke zu suchen, die für die Zuordnungseinheit zugeordnet sind.The SQL Server-Datenbank-EngineSQL Server Database Engine uses the IAM pages to find the extents allocated to the allocation unit. Für jeden Block durchsucht SQL Server-Datenbank-EngineSQL Server Database Engine die FPS-Seiten, um herauszufinden, ob eine geeignete Seite vorhanden ist.For each extent, the SQL Server-Datenbank-EngineSQL Server Database Engine searches the PFS pages to see if there is a page that can be used. Jede IAM- und PFS-Seite erfasst viele Datenseiten, sodass in jeder Datenbank nur wenige IAM- und PFS-Seiten enthalten sind.Each IAM and PFS page covers lots of data pages, so there are few IAM and PFS pages in a database. Dies bedeutet, dass sich die IAM- und PFS-Seiten normalerweise im Arbeitsspeicher des SQL ServerSQL Server-Pufferpools befinden, sodass sie schnell durchsucht werden können.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. Für Indizes wird die Einfügemarke für eine neue Zeile durch den Indexschlüssel festgelegt. Wenn jedoch eine neue Seite benötigt wird, wird der zuvor beschriebene Vorgang durchgeführt.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.

Ein neuer Block für eine Zuordnungseinheit wird nur dann von SQL Server-Datenbank-EngineSQL Server Database Engine zugeordnet, wenn es nicht schnell möglich ist, in einem vorhandenen Block eine Seite zu finden, die ausreichend Speicherplatz bietet, um die eingefügte Zeile aufnehmen zu können.The SQL Server-Datenbank-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.

Die SQL Server-Datenbank-EngineSQL Server Database Engine ordnet Blöcke auf der Basis der verfügbaren Blöcke in der Dateigruppe zu und verwendet dazu einen Zuordnungsalgorithmus zur proportionalen Füllung.The SQL Server-Datenbank-EngineSQL Server Database Engine allocates extents from those available in the filegroup using a proportional fill allocation algorithm. Wenn eine Dateigruppe zwei Dateien enthält, von denen die eine über doppelt so viel freien Speicherplatz wie die andere verfügt, werden in der Datei, die über mehr freien Speicherplatz verfügt, zwei Seiten für jede Seite zugeordnet, die in der anderen Datei zugeordnet wird.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. Dies bedeutet, dass der Anteil des verwendeten Speicherplatzes in allen Dateien einer Dateigruppe ähnlich groß sein sollte.This means that every file in a filegroup should have a similar percentage of space used.

Protokollieren geänderter BlöckeTracking Modified Extents

SQL ServerSQL Server verwendet zwei interne Datenstrukturen zum Nachverfolgen von durch Massenkopiervorgänge geänderten Blöcken sowie von Blöcken, die seit der letzten vollständigen Sicherung geändert wurden.uses two internal data structures to track extents modified by bulk copy operations and extents modified since the last full backup. Diese Datenstrukturen beschleunigen differenzielle Sicherungen erheblich.These data structures greatly speed up differential backups. Sie beschleunigen außerdem das Protokollieren von Massenkopiervorgängen, wenn eine Datenbank das Modell der massenprotokollierten Wiederherstellung verwendet.They also speed up the logging of bulk copy operations when a database is using the bulk-logged recovery model. Ähnlich wie bei den GAM-Seiten (Global Allocation Map) und den SGAM-Seiten (Shared Global Allocation Map) handelt es sich bei diesen Strukturen um Bitmuster, wobei jedes Bit einen einzelnen Block darstellt.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)
    DCM protokolliert die Blöcke, die seit der letzten Ausführung der BACKUP DATABASE-Anweisung geändert wurden.This tracks the extents that have changed since the last BACKUP DATABASE statement. Falls das Bit für einen Block den Wert 1 besitzt, wurde der Block seit der letzten Ausführung der BACKUP DATABASE-Anweisung geändert.If the bit for an extent is 1, the extent has been modified since the last BACKUP DATABASE statement. Falls das Bit den Wert 0 aufweist, wurde der Block nicht geändert.If the bit is 0, the extent has not been modified. Differenzielle Sicherungen lesen nur die DCM-Seiten, um zu ermitteln, welche Blöcke geändert wurden.Differential backups read just the DCM pages to determine which extents have been modified. Dadurch wird die Anzahl an Seiten, die eine differenzielle Sicherung scannen muss, erheblich verringert.This greatly reduces the number of pages that a differential backup must scan. Die Dauer der Ausführung einer differenziellen Sicherung ist proportional zu der Anzahl an Blöcken, die seit der letzten Ausführung der BACKUP DATABASE-Anweisung geändert wurden, und nicht proportional zu der Gesamtgröße der Datenbank.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)
    BCM protokolliert die Blöcke, die seit der letzten Ausführung der BACKUP LOG-Anweisung durch massenprotokollierte Vorgänge geändert wurden.This tracks the extents that have been modified by bulk logged operations since the last BACKUP LOG statement. Falls das Bit für einen Block den Wert 1 aufweist, wurde der Block seit der letzten Ausführung der BACKUP LOG-Anweisung durch einen massenprotokollierten Vorgang geändert.If the bit for an extent is 1, the extent has been modified by a bulk logged operation after the last BACKUP LOG statement. Falls das Bit den Wert 0 besitzt, wurde der Block nicht durch massenprotokollierte Vorgänge geändert.If the bit is 0, the extent has not been modified by bulk logged operations. BCM-Seiten treten in allen Datenbanken auf, sind jedoch nur dann relevant, wenn die Datenbank das Modell der massenprotokollierten Wiederherstellung verwendet.Although BCM pages appear in all databases, they are only relevant when the database is using the bulk-logged recovery model. Wenn bei diesem Wiederherstellungsmodell eine BACKUP LOG-Anweisung ausgeführt wird, scannt der Sicherungsvorgang die BCM-Seiten nach Blöcken, die geändert wurden.In this recovery model, when a BACKUP LOG is performed, the backup process scans the BCMs for extents that have been modified. Diese Blöcke werden dann in die Protokollsicherung eingeschlossen.It then includes those extents in the log backup. Dadurch können die massenprotokollierten Vorgänge wiederhergestellt werden, wenn die Datenbank aus einer Datenbanksicherung und einer Folge von Transaktionsprotokollsicherungen wiederhergestellt wird.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-Seiten sind in einer Datenbank, die das einfache Wiederherstellungsmodell verwendet, nicht relevant, da keine massenprotokollierten Vorgänge protokolliert sind.BCM pages are not relevant in a database that is using the simple recovery model, because no bulk logged operations are logged. Sie sind in einer Datenbank, die das Modell der vollständigen Wiederherstellung verwendet, relevant, da bei diesem Wiederherstellungsmodell massenprotokollierte Vorgänge wie vollständig protokollierte Vorgänge behandelt werden.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.

Der Abstand zwischen DCM-Seiten und BCM-Seiten ist derselbe Abstand wie zwischen GAM- und SGAM-Seiten; 64.000 Blöcke.The interval between DCM pages and BCM pages is the same as the interval between GAM and SGAM page, 64,000 extents. Die DCM- und BCM-Seiten befinden sich direkt hinter den GAM- und SGAM-Seiten in einer physischen Datei:The DCM and BCM pages are located behind the GAM and SGAM pages in a physical file:

special_page_order

Weitere InformationenSee Also

sys.allocation_units (Transact-SQL) sys.allocation_units (Transact-SQL)
Heaps (Tabellen ohne gruppierte Indizes) Heaps (Tables without Clustered Indexes)
Lesen von Seiten Reading Pages
Schreiben von SeitenWriting Pages