Leitfaden für die Architektur von Seiten und Datenbank-Shards

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Die Seite ist die grundlegende Einheit der Datenspeicherung in SQL Server. Ein Umfang ist eine Sammlung von acht physisch zusammenhängenden Seiten. Blöcke tragen zu einer effizienten Verwaltung von Seiten bei. In diesem Handbuch werden die Datenstrukturen beschrieben, die zum Verwalten von Seiten und Blöcken in allen Versionen von SQL Server verwendet werden. Kenntnisse der Architektur von Seiten und Blöcken sind Voraussetzung für das Entwerfen und Entwickeln von effizienten Datenbanken.

Seiten und Blöcke

Die grundlegende Einheit für die Datenspeicherung in SQL Server ist die Seite. Der speicherplatz, der einer Datendatei (MDF oder NDF) in einer Datenbank zugeordnet ist, wird logisch in Seiten unterteilt, die zusammenhängend von 0 bis n nummeriert sind. Datenträger-E/A-Operationen werden auf Seitenebene ausgeführt. Dies bedeutet, dass SQL Server ganze Datenseiten liest oder schreibt.

Blöcke sind Auflistungen von acht physisch zusammenhängenden Seiten; sie werden zum effizienten Verwalten der Seiten verwendet. Alle Seiten sind in Blöcke unterteilt.

Seiten

In einem regulären Buch werden alle Inhalte auf Seiten geschrieben. Ähnlich wie bei einem Buch schreibt SQL Server alle Datenzeilen auf Seiten, und alle Datenseiten haben dieselbe Größe: 8 KB. In einem Buch enthalten die meisten Seiten die Daten - den Hauptinhalt des Buchs - und einige Seiten enthalten Metadaten zum Inhalt (z. B. das Inhaltsverzeichnis und den Index). Auch hier unterscheidet sich SQL Server nicht: Die meisten Seiten enthalten tatsächliche Datenzeilen, die von Benutzern gespeichert wurden; diese werden als Datenseiten und Text-/Bildseiten (für Sonderfälle) bezeichnet. Die Indexseiten enthalten Indexverweise darüber, wo sich die Daten befinden. Schließlich gibt es Systemseiten , die verschiedene Metadaten zur Organisation der Daten speichern.

Jede Seite beginnt mit einem 96 Byte umfassenden Header, der zum Speichern von Systeminformationen zu der betreffenden Seite verwendet wird. 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.

Die folgende Tabelle zeigt die Seitentypen, die in Datendateien einer SQL Server-Datenbank verwendet werden.

Seitentyp Inhalte
Daten Datenzeilen mit allen Daten, mit Ausnahme von Text, ntext, Bild, nvarchar(max), varchar(max), varbinary(max) und XML-Daten , wenn Text in Zeile auf EIN festgelegt ist.
Index Indexeinträge
Text/Bild Datentypen für große Objekte: Text, ntext, Bild, nvarchar(max), varchar(max), varbinary(max) und XML-Daten.

Spalten mit variabler Länge, wenn die Datenzeile 8 KB überschreitet: varchar, nvarchar, varbinary und sql_variant.
Global Allocation Map (GAM)

Shared Global Allocation Map (SGAM)
Informationen dazu, ob Blöcke zugeordnet sind.
Page Free Space (PFS) Informationen zur Seitenzuordnung sowie zum freien Speicherplatz, der auf Seiten verfügbar ist.
Indexzuordnungszuordnung (IAM) Informationen zu Blöcken, die von einer Tabelle oder einem Index pro Zuordnungseinheit verwendet werden.
Bulk Changed Map (BCM) Informationen zu Blöcken, die seit der letzten Ausführung der BACKUP LOG-Anweisung pro Zuordnungseinheit durch Massenvorgänge geändert wurden.
Differential Changed Map (DCM) Informationen zu Blöcken, die seit der letzten Ausführung der BACKUP DATABASE-Anweisung pro Zuordnungseinheit geändert wurden.

Hinweis

Protokolldateien enthalten keine Seiten. Sie enthalten eine Reihe von Protokolldatensätzen, die keine feste Größe aufweisen.

Datenzeilen werden fortlaufend auf der Seite gespeichert, beginnend unmittelbar nach der Kopfzeile. Eine Zeilenoffsettabelle beginnt am Ende der Seite, und jede Zeilenoffsettabelle enthält einen Eintrag für jede Zeile auf der Seite. Jeder Zeilenoffseteintrag speichert, wie weit das erste Byte der Zeile vom Anfang der Seite entfernt ist. Die Funktion der Zeilenoffsettabelle soll sql Server daher helfen, Zeilen auf einer Seite schnell zu finden. Die Einträge in der Zeilenoffsettabelle befinden sich in umgekehrter Reihenfolge zur Reihenfolge der Zeilen auf der Seite.

Diagram of the SQL Server data page.

Unterstützung für große Zeilen

Zeilen können keine Seiten umfassen; Teile der Zeile können jedoch von der Seite der Zeile verschoben werden, sodass die Zeile sehr groß sein kann. Die maximale Menge an Daten und Mehraufwand, die in einer einzelnen Zeile auf einer Seite enthalten ist, beträgt 8.060 Byte. Dies schließt nicht die im Text-/Bildseitentyp gespeicherten Daten ein.

Diese Einschränkung ist für Tabellen, die Varchar-, nvarchar-, varbinary- oder sql_variant Spalten enthalten, entspannt. Wenn die Gesamtzeilengröße aller festen und variablen Spalten in einer Tabelle die Einschränkung von 8.060 Byte überschreitet, verschiebt SQL Server dynamisch eine oder mehrere Spalten mit variabler Länge auf Seiten in der ROW_OVERFLOW_DATA Zuordnungseinheit, beginnend mit der Spalte mit der größten Breite.

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. 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. Falls eine nachfolgende Operation die Spaltengröße verringert, verschiebt SQL Server die Spalten dynamisch zurück auf die ursprüngliche Datenseite.

Überlegungen zum Zeilenüberlauf

Eine Zeile kann sich nicht auf mehreren Seiten befinden und kann überlaufen, wenn die kombinierte Größe von Datentypfeldern mit variabler Länge den Grenzwert von 8060 Byte überschreitet. Zur Veranschaulichung kann eine Tabelle mit zwei Spalten erstellt werden: eine varchar(7000) und eine andere varchar (2000). Einzeln überschreitet keine Spalte 8060 Byte, kann aber kombiniert werden, wenn die gesamte Breite jeder Spalte gefüllt ist. SQL Server kann die variable Längenspalte varchar(7000) dynamisch auf Seiten in der ROW_OVERFLOW_DATA Zuordnungseinheit verschieben. Wenn Sie varchar-, nvarchar-, varbinary- oder sql_variant- oder CLR-benutzerdefinierte Spalten kombinieren, die 8.060 Bytes pro Zeile überschreiten, sollten Sie Folgendes berücksichtigen:

  • Das Verschieben großer Datensätze zu einer anderen Seite geschieht dynamisch, wenn die Datensätze im Ergebnis von Updatevorgängen verlängert wurden. 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.

    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.

    Berücksichtigen Sie daher beim Entwerfen einer Tabelle mit mehreren Varchar-, nvarchar-, varbinary- oder sql_variant- oder CLR-Benutzerdefinierten Typspalten den Prozentsatz der Zeilen, die wahrscheinlich überlaufen werden, und die Häufigkeit, mit der diese Überlaufdaten wahrscheinlich abgefragt werden. 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. Diese können dann in einer asynchronen JOIN-Operation abgefragt werden.

  • Die Länge einzelner Spalten muss weiterhin innerhalb des Grenzwerts von 8.000 Bytes für varchar-, nvarchar-, varbinary- oder sql_variant- und CLR-Benutzerdefinierte Typspalten liegen. Lediglich ihre kombinierten Längen dürfen das Zeilenlimit von 8.060 Byte einer Tabelle überschreiten.

  • Die Summe anderer Datentypspalten, einschließlich Char - und nchar-Daten , muss innerhalb des Grenzwerts von 8.060 Bytezeilen liegen. Große Objektdaten sind ebenfalls vom 8.060-Byte-Zeilenlimit ausgenommen.

  • Der Indexschlüssel eines gruppierten Index kann keine Spalten des Datentyps varchar enthalten, bei denen Daten in der Zuordnungseinheit ROW_OVERFLOW_DATA vorhanden sind. 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. Weitere Informationen zu Zuordnungseinheiten finden Sie in der Indexarchitektur und im Entwurfshandbuch.

  • Sie können Spalten, die Daten mit Zeilenüberlauf enthalten, als Schlüssel- oder Nichtschlüsselspalten eines nicht gruppierten Index einbeziehen.

  • Die Datensatzgrößenbeschränkung für Tabellen, die Sparsespalten verwenden, beträgt 8.018 Byte. Wenn die konvertierten Daten zusammen mit den vorhandenen Datensatzdaten 8.018 Byte überschreiten, wird MSSQLSERVER ERROR 576 zurückgegeben. Wenn Spalten zwischen Sparse- und Nichtsparsetypen konvertiert werden, behält das Datenbankmodul eine Kopie der aktuellen Datensatzdaten bei. Dies verdoppelt vorübergehend den Speicher, der für den Datensatz erforderlich ist.

  • 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.

Extents

Blöcke sind die Grundeinheit, in der Speicherplatz verwaltet wird. Ein Block umfasst acht zusammenhängende Seiten, also 64 KB. Dies bedeutet, dass SQL Server-Datenbanken 16 Ausmaße pro Megabyte aufweisen.

SQL Server verfügt über zwei Arten von Blöcken:

  • Einheitliche Blöcke befinden sich im Besitz eines einzigen Objekts; alle acht Seiten in dem Block können nur vom besitzenden Objekt verwendet werden.
  • Gemischte Blöcke werden für bis zu acht Objekte freigegeben. Jede der acht Seiten im Block kann im Besitz eines anderen Objekts sein.

Diagram showing uniform and mixed extents.

Bis zu und einschließlich SQL Server 2014 (12.x) ordnet das Datenbankmodul Tabellen mit kleinen Datenmengen nicht vollständig zu. Für eine neue Tabelle oder einen neuen Index werden normalerweise Seiten aus gemischten Blöcken zugewiesen. 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. 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.

Ab SQL Server 2016 (13.x) ist die Standardeinstellung für die meisten Zuordnungen in einer Benutzerdatenbank und tempdb die Verwendung einheitlicher Ausmaße, mit Ausnahme von Zuordnungen, die zu den ersten acht Seiten einer IAM-Kette gehören. Zuordnungen für master, msdbund model Datenbanken behalten weiterhin das vorherige Verhalten bei.

Hinweis

In SQL Server können Sie bis zu SQL Server 2014 (12.x) das Ablaufverfolgungskennzeichnung (TF) 1118 verwenden, um die Standardzuordnung so zu ändern, dass immer einheitliche Ausmaße verwendet werden. Weitere Informationen zu diesem Ablaufverfolgungsflag finden Sie unter DBCC TRACEON – Trace Flags.

Ab SQL Server 2016 (13.x) wird die von TF 1118 bereitgestellte Funktionalität automatisch für tempdb und alle Benutzerdatenbanken aktiviert. Bei Benutzerdatenbanken wird dieses Verhalten durch die SET MIXED_PAGE_ALLOCATION Option " ALTER DATABASE, wobei der Standardwert auf OFF festgelegt ist, und TF 1118 hat keine Auswirkung. Weitere Informationen finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL).

Ab SQL Server 2012 (11.x) kann die sys.dm_db_database_page_allocations Systemfunktion Seitenzuordnungsinformationen für eine Datenbank, Tabelle, Index und Partition melden.

Wichtig

Die Systemfunktion sys.dm_db_database_page_allocations ist nicht dokumentiert kann jederzeit geändert werden. Kompatibilität wird nicht sichergestellt.

Ab SQL Server 2019 (15.x) ist die sys.dm_db_page_info Systemfunktion verfügbar und gibt Informationen zu einer Seite in einer Datenbank zurück. Die Funktion gibt eine Zeile zurück, die die Kopfzeileninformationen von der Seite enthält, einschließlich des object_id, index_idund partition_id. Dank dieser Funktion ist die Verwendung von DBCC PAGE in den meisten Fällen nicht mehr erforderlich.

Verwalten von Umfangszuweisungen und freiem Speicherplatz

Die SQL Server-Datenstrukturen, die Blockzuordnungen verwalten und freien Speicherplatz nachverfolgen, besitzen eine relativ einfache Struktur. Das hat folgende Vorteile:

  • Die Informationen zum freien Speicherplatz sind dicht gepackt, sodass nur relativ wenig Seiten benötigt werden, um diese Informationen aufzunehmen.

    Dies erhöht die Geschwindigkeit, indem die Anzahl der Datenträgerlesevorgänge reduziert wird, die zum Abrufen von Zuordnungsinformationen erforderlich sind. Hierdurch wird auch die Wahrscheinlichkeit erhöht, dass die Zuordnungsseiten im Arbeitsspeicher verbleiben und somit keine weiteren Lesevorgänge erforderlich sind.

  • Die meisten Zuordnungsinformationen werden nicht miteinander verkettet. Hierdurch wird die Verwaltung der Zuordnungsinformationen vereinfacht.

    Das Zuordnen oder Aufheben der Zuordnung der einzelnen Seiten kann sehr schnell erfolgen. So wird die Anzahl der Konflikte zwischen gleichzeitig ausgeführten Tasks reduziert, die Seiten zuordnen oder die Zuordnung von Seiten aufheben müssen.

Verwalten von Umfangszuweisungen

SQL Server verwendet zwei Arten von Zuordnungstabellen, um die Zuordnung von Blöcken aufzuzeichnen:

  • Global Allocation Map (GAM)

    GAM-Seiten zeichnen auf, welche Blöcke zugeordnet wurden. Jede GAM erfasst 64.000 Blöcke, was fast 4 GB an Daten entspricht. Das GAM hat 1 Bit für jedes Ausmaß im Intervall, das es abdeckt. Wenn das Bit ist, ist 1das Ausmaß frei; wenn das Bit ist 0, wird das Ausmaß zugewiesen.

  • 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. Jede SGAM erfasst 64.000 Blöcke, was fast 4 GB an Daten entspricht. Das SGAM hat 1 Bit für jedes Ausmaß im Intervall, das es abdeckt. Wenn das Bit ist 1, wird das Ausmaß als gemischtes Ausmaß verwendet und hat eine kostenlose Seite. Wenn das Bit lautet 0, wird das Ausmaß nicht als gemischtes Ausmaß verwendet, oder es handelt sich um ein gemischtes Ausmaß, und alle zugehörigen Seiten werden verwendet.

Für jeden Block wird auf der Grundlage der aktuellen Verwendung eines der folgenden Bitmuster in der GAM oder der SGAM festgelegt.

Aktuelle Blockverwendung GAM-Biteinstellung SGAM-Biteinstellung
Frei, wird nicht verwendet 1 0
Einheitlicher Block oder vollständig belegter gemischter Block 0 0
Gemischter Block mit freien Seiten 0 1

Dies führt zu einfachen Algorithmen für die Blockverwaltung.

  • Um ein einheitliches Ausmaß zuzuweisen, durchsucht das Datenbankmodul das GAM nach einem 1 Bit und legt es auf 0fest.
  • Um ein gemischtes Ausmaß mit kostenlosen Seiten zu finden, durchsucht das Datenbankmodul das SGAM ein 1 wenig.
  • Um ein gemischtes Ausmaß zuzuweisen, durchsucht das Datenbankmodul das GAM nach einem 1 Bit, legt es fest 0und legt dann auch das entsprechende Bit im SGAM auf 1.
  • Um eine Erweiterung zu umgehen, stellt das Datenbankmodul sicher, dass das GAM-Bit auf festgelegt 1ist, und das SGAM-Bit auf 0.

Die Algorithmen, die intern vom Datenbankmodul verwendet werden, sind komplexer als die in diesem Artikel beschriebenen, da das Datenbankmodul Daten gleichmäßig in einer Datenbank verteilt. Aber auch die wirklich verwendeten Algorithmen konnten vereinfacht werden, da nunmehr keine verketteten Blockzuordnungsinformationen verwaltet werden müssen.

Nachverfolgen von freiem Speicherplatz

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. Der PFS verfügt über 1 Byte für jede Seite, zeichnet auf, ob die Seite zugeordnet ist, und wenn ja, ob es leer ist, 1 bis 50 Prozent voll, 51 bis 80 Prozent voll, 81 bis 95 Prozent voll oder 96 bis 100 Prozent voll.

Nachdem ein Block einem Objekt zugeordnet wurde, verwendet die Datenbank-Engine die PFS-Seiten, um aufzuzeichnen, welche Seiten in dem jeweiligen Block zugeordnet und welche Seiten frei sind. Diese Informationen werden verwendet, wenn die Datenbank-Engine eine neue Seite zuordnen muss. Der freie Speicherplatz auf einer Seite wird nur für Heap- und Text-/Bildseiten beibehalten. Diese Information wird verwendet, wenn die Datenbank-Engine eine Seite mit verfügbarem freien Speicherplatz sucht, um eine neu eingefügte Zeile aufzunehmen. Indizes erfordern nicht, dass der freie Speicherplatz der Seite nachverfolgt wird, da der Punkt, an dem eine neue Zeile eingefügt werden soll, durch die Indexschlüsselwerte festgelegt wird.

In der Datendatei wird für jeden zusätzlichen Bereich, der nachverfolgt wird, eine neue PFS-, GAM- oder SGAM-Seite hinzugefügt. Nach der ersten PFS-Seite folgt also alle 8.088 Seiten eine neue PFS-Seite. So stellen also die Seiten mit Seiten-ID 1, Seiten-ID 8088 und Seiten-ID 16176 PFS-Seiten dar.

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. Dementsprechend folgt nach der ersten SGAM-Seite im Abstand von 64.000 Blöcken jeweils eine neue SGAM-Seite.

Folgende Abbildung veranschaulicht die Abfolge der Seiten, die von der Datenbank-Engine für das Zuordnen und Verwalten von Blöcken verwendet werden.

Diagram showing the sequence of pages for managing extents.

Verwalten des von Objekten verwendeten Platzes

Eine IAM-Seite (Index Allocation Map) ordnet die Blöcke in einem 4-GB-Teil einer Datenbankdatei zu, die von einer Zuordnungseinheit verwendet wird. Eine Zuordnungseinheit entspricht einem von drei möglichen Typen:

  • IN_ROW_DATA

    Enthält eine Partition eines Heap oder eines Index.

  • LOB_DATA

    Enthält Datentypen für große Objekte (LOB), z . B. XML, varbinary(max), und varchar(max).

  • ROW_OVERFLOW_DATA

    Enthält Daten mit variabler Länge, die in varchar-, nvarchar-, varbinary- oder sql_variant Spalten gespeichert sind, die den Grenzwert für die Zeilengröße von 8.060 Byte überschreiten.

Jede Partition eines Heap oder Index enthält mindestens eine IN_ROW_DATA-Zuordnungseinheit. Sie kann je nach dem Heap- oder Indexschema auch eine LOB_DATA- oder ROW_OVERFLOW_DATA-Zuordnungseinheit enthalten.

Eine IAM-Seite deckt einen 4-GB-Bereich in einer Datei ab und besitzt dieselbe Erfassung wie eine GAM- oder SGAM-Seite. 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. Deshalb hat jede Zuordnungseinheit mindestens eine IAM-Seite für jede Datei, aus der sie Blöcke enthält. 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.

Diagram showing the distribution of IAM pages.

IAM-Seiten werden je nach Bedarf für jede Zuordnungseinheit zugeordnet und nach dem Zufallsprinzip in der Datei verteilt. Die Systemsicht sys.system_internals_allocation_units zeigt auf die erste IAM-Seite für eine Zuordnungseinheit. Alle IAM-Seiten für diese Zuordnungseinheit sind in einer IAM-Kette miteinander verknüpft.

Wichtig

Die Systemsicht sys.system_internals_allocation_units ist nur zur internen Verwendung bestimmt und kann geändert werden. Kompatibilität wird nicht sichergestellt. Diese Ansicht steht In Azure SQL-Datenbank nicht zur Verfügung.

Diagram showing IAM pages linked in a chain per allocation unit.

Eine IAM-Seite weist eine Kopfzeile auf, die den Anfangsumfang des Bereichs der vom IAM-Zeichenblatt zugeordneten Bereiche angibt. Die IAM-Seite verfügt darüber hinaus über ein großes Bitmuster, in dem jedes Bit einen Block darstellt. Das erste Bit in dem Bitmuster stellt den ersten Block im Bereich dar, das zweite Bit stellt den zweiten Block dar usw. Wenn ein Bisschen ist 0, wird das Ausmaß, das sie darstellt, nicht der Zuordnungseinheit zugeordnet, die das IAM besitzt. Wenn das Bit lautet 1, wird das Ausmaß, das es darstellt, der Zuordnungseinheit zugeordnet, die die IAM-Seite besitzt.

Wenn das Datenbankmodul eine neue Zeile einfügen muss und kein Leerraum auf der aktuellen Seite verfügbar ist, verwendet es die IAM- und PFS-Seiten, um eine Seite zu finden, um eine Seite zuzuordnen, oder für eine Heap- oder eine Text-/Bildseite eine Seite mit ausreichend Platz zum Speichern der Zeile. Die Datenbank-Engine verwendet IAM-Seiten, um die Blöcke zu suchen, die für die Zuordnungseinheit zugeordnet sind. Für jeden Block durchsucht die Datenbank-Engine die PFS-Seiten, um herauszufinden, ob eine geeignete Seite vorhanden ist. Jede IAM- und PFS-Seite umfasst viele Datenseiten, daher gibt es nur wenige IAM- und PFS-Seiten in einer Datenbank. Dies bedeutet, dass sich die IAM- und PFS-Seiten normalerweise im Arbeitsspeicher des SQL Server-Pufferpools befinden, sodass sie schnell durchsucht werden können. 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.

Das Datenbankmodul weist einer Zuordnungseinheit nur dann ein neues Ausmaß zu, wenn eine Seite in vorhandenem Umfang nicht schnell gefunden werden kann, wobei ausreichend Platz zum Einfügen der Zeile vorhanden ist.

Proportionale Füllungszuordnung

Das Datenbankmodul weist Ausdehnungen von den in der Dateigruppe verfügbaren Daten mithilfe eines Proportional-Füllzuordnungsalgorithmus zu. In derselben Dateigruppe mit zwei Dateien, wenn eine Datei den freien Speicherplatz wie die andere hat, werden zwei Seiten aus der Datei mit dem verfügbaren Speicherplatz für jede Seite zugewiesen, die aus der anderen Datei zugeordnet ist. Dies bedeutet, dass der Anteil des verwendeten Speicherplatzes in allen Dateien einer Dateigruppe ähnlich groß sein sollte.

Nachverfolgen geänderter Ausmaße

SQL Server verwendet zwei interne Datenstrukturen zum Nachverfolgen von Ausmaßen, die von Massenkopievorgängen geändert wurden, und Erweiterungen, die seit der letzten vollständigen Sicherung geändert wurden. Diese Datenstrukturen beschleunigen differenzielle Sicherungen erheblich. Sie beschleunigen außerdem das Protokollieren von Massenkopiervorgängen, wenn eine Datenbank das Modell der massenprotokollierten Wiederherstellung verwendet. Wie die GAM- und SGAM-Seiten sind diese Strukturen Bitmaps, in denen jedes Bit ein einzelnes Ausmaß darstellt.

  • Differential Changed Map (DCM)

    DCM protokolliert die Blöcke, die seit der letzten Ausführung der BACKUP DATABASE-Anweisung geändert wurden. Wenn das Bit für ein Ausmaß ist 1, wurde das Ausmaß seit der letzten BACKUP DATABASE Anweisung geändert. Wenn das Bit lautet 0, wurde das Ausmaß nicht geändert.

    Differenzielle Sicherungen lesen nur die DCM-Seiten, um zu ermitteln, welche Blöcke geändert wurden. Dadurch wird die Anzahl an Seiten, die eine differenzielle Sicherung scannen muss, erheblich verringert. Die Dauer, die eine differenzielle Sicherung ausführt, ist proportional zur Anzahl der Seit der letzten BACKUP DATABASE Anweisung geänderten Ausmaße und nicht der Gesamtgröße der Datenbank.

  • Bulk Changed Map (BCM)

    Dadurch werden die Ausmaße nachverfolgt, die seit der letzten BACKUP LOG Anweisung durch Massenprotokollierungen geändert wurden. Wenn das Bit für eine Erweiterung gilt 1, wurde das Ausmaß nach der letzten BACKUP LOG Anweisung durch einen massenprotokollierten Vorgang geändert. Wenn das Bit lautet 0, wurde der Umfang nicht durch massenprotokollierte Vorgänge geändert.

    BCM-Seiten treten in allen Datenbanken auf, sind jedoch nur dann relevant, wenn die Datenbank das Modell der massenprotokollierten Wiederherstellung verwendet. Wenn bei diesem Wiederherstellungsmodell eine BACKUP LOG-Anweisung ausgeführt wird, scannt der Sicherungsvorgang die BCM-Seiten nach Blöcken, die geändert wurden. Diese Blöcke werden dann in die Protokollsicherung eingeschlossen. Dadurch werden die Massenprotokollvorgänge wiederhergestellt, wenn die Datenbank aus einer Datenbanksicherung und einer Sequenz von Transaktionsprotokollsicherungen wiederhergestellt wird. BCM-Seiten sind in einer Datenbank, die das einfache Wiederherstellungsmodell verwendet, nicht relevant, da keine Massenprotokolliervorgänge protokolliert werden. Sie sind in einer Datenbank, die das vollständige Wiederherstellungsmodell verwendet, nicht relevant, da dieses Wiederherstellungsmodell protokollierte Massenvorgänge als vollständig protokollierte Vorgänge behandelt.

Der Abstand zwischen DCM-Seiten und BCM-Seiten ist derselbe Abstand wie zwischen GAM- und SGAM-Seiten; 64.000 Blöcke. Die SEITEN DCM und BCM befinden sich hinter den GAM- und SGAM-Seiten in einer physischen Datei wie folgt:

Diagram showing the interval distribution of special pages.

Siehe auch