Verwalten von Blockzuordnungen und freiem Speicherplatz
Die SQL Server-Datenstrukturen, die Blockzuordnungen verwalten und freien Speicherplatz nachverfolgen, besitzen eine relativ einfache Struktur. Dies bringt folgende Vorteile mit sich:
Die Informationen zum freien Speicherplatz sind dicht gepackt, sodass nur relativ wenig Seiten benötigt werden, um diese Informationen aufzunehmen.
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. Hierdurch wird auch die Wahrscheinlichkeit erhöht, dass die Zuordnungsseiten im Arbeitsspeicher verbleiben und somit keine weiteren Lesevorgänge erforderlich sind.
Der größte Teil der Zuordnungsinformationen ist 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 Blockzuordnungen
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. Die GAM verfügt über ein Bit für jeden Block in dem Intervall, das von ihr abgedeckt wird. Hat das Bit den Wert 1, ist der Block frei; hat das Bit den Wert 0, ist der Block zugeordnet.
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. Die SGAM verfügt über ein Bit für jeden Block in dem Intervall, das von ihr abgedeckt wird. Wenn das Bit den Wert 1 hat, wird der Block als gemischter Block verwendet und verfügt über eine freie Seite. 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.
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 |
Daraus ergeben sich einfache Algorithmen für die Blockverwaltung. Um einen einheitlichen Block zuzuordnen, durchsucht Database Engine (Datenbankmodul) die GAM nach einem Bit mit dem Wert 1 und legt es auf 0 fest. Um einen gemischten Block mit freien Seiten zu finden, durchsucht Database Engine (Datenbankmodul) die SGAM nach einem Bit mit dem Wert 1. Um einen gemischten Block zuzuordnen, durchsucht Database Engine (Datenbankmodul) die GAM nach einem Bit mit dem Wert 1, legt es auf 1 fest und legt anschließend das entsprechende Bit in der SGAM auf 1 fest. Um einen Block freizugeben, muss Database Engine (Datenbankmodul) sicherstellen, dass das GAM-Bit auf 1 und das entsprechende SGAM-Bit auf 0 festgelegt ist. Die eigentlichen Algorithmen, die intern von Database Engine (Datenbankmodul) verwendet werden, sind komplexer als die Beschreibung in diesem Thema, da Database Engine (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 auf den einzelnen Seiten. Der PFS verfügt über ein Byte pro Seite und zeichnet auf, ob die Seite zugeordnet ist, und sofern dies der Fall ist, ob sie leer, 1 bis 50 Prozent voll, 51 bis 80 Prozent voll, 81 bis 95 Prozent voll oder 96 bis 100 Prozent voll ist.
Nachdem ein Block einem Objekt zugeordnet wurde, verwendet Database Engine (Datenbankmodul) die PFS-Seiten, um aufzuzeichnen, welche Seiten in dem jeweiligen Block zugeordnet und welche Seiten frei sind. Diese Informationen werden verwendet, wenn Database Engine (Datenbankmodul) eine neue Seite zuordnen muss. Die Menge des freien Speicherplatzes auf einer Seite wird nur für Heap- und Text/Image-Seiten verwaltet. Diese Information wird verwendet, wenn Database Engine (Datenbankmodul) eine Seite mit verfügbarem freien Speicherplatz sucht, um eine neu eingefügte Zeile aufzunehmen. 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.
Eine PFS-Seite ist nach der Dateiheaderseite die erste Seite in einer Datendatei (Seitennummer 1). Auf diese folgt eine GAM-Seite (Seitennummer 2) und anschließend eine SGAM-Seite (Seite 3). Ungefähr alle 8.000 Seiten nach der ersten PFS-Seite folgt eine weitere PFS-Seite. 64.000 Blöcke nach der ersten GAM-Seite folgt eine weitere GAM-Seite auf Seite 2. Eine weitere SGAM-Seite folgt nach 64.000 Blöcken nach der ersten SGAM-Seite auf Seite 3. Folgende Abbildung veranschaulicht die Abfolge der Seiten, die von Database Engine (Datenbankmodul) für das Zuordnen und Verwalten von Blöcken verwendet werden.