Grundlegendes zu Seiten und Blöcken

Die grundlegende Einheit für die Datenspeicherung in SQL Server ist die Seite. Der Speicherplatz, der einer Datendatei (MDF- oder NDF-Datei) in einer Datenbank zugeordnet wird, ist 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 werden in Blöcken gespeichert.

Seiten

In SQL Server beträgt die Größe einer Seite 8 KB. Dies bedeutet, dass SQL Server-Datenbanken über 128 Seiten pro 1 MB verfügen. 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

Inhalt

Daten

Datenzeilen mit allen Daten, ausgenommen text-, ntext-, image-, nvarchar(max)-, varchar(max)-, varbinary(max)- und xml-Daten, wenn text in row auf ON festgelegt wurde.

Index

Indexeinträge

Text/Image

LOB-Datentypen (Large Object):

  • text-, ntext-, image-, nvarchar(max)-, varchar(max)-, varbinary(max)- und xml-Daten.

Spalten variabler Länge, wenn die Datenzeile 8 KB übersteigt:

  • varchar, nvarchar, varbinary und sql_variant.

Global Allocation Map, Shared Global Allocation Map

Informationen dazu, ob Blöcke zugeordnet sind.

Page Free Space (PFS)

Informationen zur Seitenzuordnung sowie zum freien Speicherplatz, der auf Seiten verfügbar ist.

Index Allocation Map (IAM)

Informationen zu Blöcken, die von einer Tabelle oder einem Index pro Zuordnungseinheit verwendet werden.

Bulk Changed Map

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

Informationen zu Blöcken, die seit der letzten Ausführung der BACKUP DATABASE-Anweisung pro Zuordnungseinheit geändert wurden.

HinweisHinweis

Protokolldateien enthalten keine Seiten; sie enthalten eine Folge von Protokolldatensätze.

Datenzeilen werden unmittelbar nach dem Header nacheinander auf der Seite gespeichert. Eine Zeilenoffsettabelle beginnt am Ende der Seite, und jede Zeilenoffsettabelle enthält einen Eintrag für jede Zeile auf der Seite. Jeder dieser Einträge zeichnet auf, wie weit das erste Byte der Zeile vom Beginn der Seite entfernt ist. Die Einträge in der Zeilenoffsettabelle befinden sich in umgekehrter Reihenfolge zur Reihenfolge der Zeilen auf der Seite.

SQL Server-Datenseite mit Zeilenoffsets

Unterstützung von umfangreichen Zeilen

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. Die maximale Menge an Daten und Verwaltungsbytes, die in einer einzelnen Zeile auf einer Seite enthalten sein können, beträgt 8.060 Byte (8 KB). Dies schließt jedoch nicht die Daten ein, die im Text/Image-Seitentyp gespeichert werden. Diese Einschränkung wurde für Tabellen gelockert, die varchar-, nvarchar-, varbinary- oder sql_variant-Spalten enthalten. Wenn die Gesamtzeilengröße aller festen und variablen Spalten in einer Tabelle den Grenzwert von 8.060 Byte übersteigen, verschiebt SQL Server eine oder mehrere Spalten variabler Länge dynamisch auf Seiten in der ROW_OVERFLOW_DATA-Zuordnungseinheit. Dabei wird mit der umfangreichsten Spalte begonnen. Dieser Vorgang wird immer ausgeführt, wenn die Gesamtgröße der Zeile durch eine Einfüge- oder Aktualisierungsoperation 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. Weitere Informationen finden Sie unter Zeilenüberlauf bei Daten über 8 KB.

Blöcke

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 über 16 Blöcke pro 1 MB verfügen.

Um eine effiziente Speicherplatzzuordnung zu erzielen, ordnet SQL Server keine ganzen Blöcke für Tabellen zu, die nur einen geringen Umfang an Daten enthalten. 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.

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.

Gemischte und gleichartige Blöcke