SQL Server Closeup #2: Strukturen zur Speicherung von Daten – Pages

Im den ersten Postings der "SQL Server Closeup" Serie möchte ich einen Überblick über die Strukturen zur Speicherung von Daten in der SQL Server Storage Engine geben.

Im vorherigen Teil war das Thema Records an der Reihe.
Hier wurden die verschiedenen Typen von Records sowie am Beispiel des Data Records die Struktur der Records beleuchtet.
Dieses Mal werde ich mich dem Thema "Pages" widmen.

 

Welche Typen von Pages gibt es?

Data Page

  • Speichert ausschließlich Data Records.
  • Entweder als Heap oder als Blattknoten eines Index.

Index Page

  • Speichert ausschließlich Index Records.
  • Entweder die Blattknoten eines Non-Clustered Index oder die Nicht-Blattknoten aller Indexarten.

Text Page

  • Speichert ausschließlich Text Records.
  • Entweder verschiedene einzelnen Text Records, so lange sie jeweils kleiner als 8 Kilobytes sind, oder als unstrukturierter Baum, falls es sich um ein Text Record von mehr als 8 Kilobyte handelt.

Sort Page

  • Dieser Typ kann nur in der tempdb vorkommen.
  • Er wird vom SQL Server bei Sortiervorgängen dazu benutzt, um Teile auf die Festplatte auslagern zu können.

Boot Page

  • Der wohl wichtigste Page-Typ ist die Boot Page
  • Diese gibt es nur ein einziges mal pro Datenbank
  • Sie hat immer die Page ID 1:9 (File ID 1 + Page in File ID 9)
  • Auf Ihr werden die Basisdaten der Datenbank gespeichert, wie z.B. Daten über Sicherungseinstellungen, "Welche Dateien gehören zur Datenbank" oder "Welche GUIDs haben diese Dateien".
  • Falls diese Page einmal defekt sein sollte, muss mindestens die PRIMARY Filegroup zurückgesichert werden.

File Header Page

  • Diesen Page Typ gibt es einmal pro Datenbankdatei.
  • Es ist immer die erste Page in der Datei.
  • Auf Ihr werden die Basisdaten der Datenbankdatei gespeichert.
  • Falls diese Page einmal defekt sein sollte, muss die entsprechende Filegroup zurückgesichert werden.

Allocation Bitmaps

  • Es gibt weitere Page Typen, die unter die Kategorie Allocation Bitmaps fallen:
    PFS, GAM, SGAM, IAM, DIFF_MAP, ML_MAP
  • Diese werde ich in einem späteren Posting näher erklären.

 

Wie ist ein Page aufgebaut?

SQL Server Page

© Paul S. Randal, SQLskills.com

Die Struktur einer Page sieht wie folgt aus:

  • Jede Page hat einen 96 Bytes großen Kopf (engl. Header), der folgende Informationen enthält:

    • pageID – Bestehend aus File ID und Page in File ID.
    • nextPage – Gibt bei verketteten Pages die PageID der nachgelagerte Page an.
    • prevPage – Gibt bei verketteten Pages die PageID der vorherige Page an.
    • Metadata: ObjectId – Die ID des Objektes zu dem diese Page gehört.
    • Metadata: PartitionId – Die ID der Partition zu dem diese Page gehört.
    • Metadata: AllocUnitId – Die ID der Allocation Unit zu dem diese Page gehört.
    • LSN – Die Log Sequence Number (LSN) des letzten Logeintrages, der diese Page verändert hat.
    • slotCnt – Die Anzahl der Datensätze (engl. Slots / Rows / Records), die auf dieser Page gespeichert sind.
    • Level – Der Level der Page, falls es sich um eine Index Page handelt.
      Der Wert 0 zeigt einen Blattlevel bzw. Blattknoten an.
    • indexId – Der Index für diese Page.
      Bei Data Pages ist dieser immer 0.
    • freeData – Der Byte Offset (Position) des ersten verfügbaren freien Platzes innerhalb der Page.
    • Pminlen – Die Anzahl der Bytes des Nicht-Variablen-Spalten-Teils des Records.
    • freeCnt – Die Anzahl der freien Bytes der Page.
    • reservedCnt – Die Anzahl der reservierten Bytes aller Transaktionen.
    • xactreserved – Die Anzahl der reservierten Bytes der zu letzt gestarteten Transaktion.
    • tornBits – Eine Bit-Zeichenkette (1 Bit pro Sektor), die für die Torn-Page-Detection genutzt wird.
      Dazu in einem späteren Posting mehr.
    • flagBits – Ein 2 Byte großer Bereich für weitere Informationen über die Page.
  • Nach dem Header kommt der 8060 Byte große Datenbereich für die Records.
  • Am Ende jeder Page befindet sich das Row Offset Array (manchmal auch Slot Array genannt), welches eine 2 Byte große Positionsangabe für jeden Record enthält.
    Das Row Offset Array gibt die logische Reihenfolge der Records an und wird in umgekehrter Reihenfolge gespeichert.

Quellen: SQLskills.com und Microsoft® SQL Server® 2008 Internals (ISBN-10: 0735626243)

Check Also

SQL Saturday #409 Rheinland – Slides und Demos

Vergangenen Samstag fand der dritte deutsche SQL Saturday statt. Wie auch im letzten Jahr konnte dafür als Austragungsort die Hochschule Bonn-Rhein-Sieg genutzt werden. Gemeinsam mit Alexander Karl durfte ich dort eine Session zum Thema "SQL Server vs. Azure DocumentDB – Ein Battle zwischen XML und JSON" halten. Die verwendeten Slides und Code Beispiele findet ihr in diesem Blog Post.