/ Datenbanken

Abfragekosten Index Scan

Geschätzte Kosten eines Index-Scans entlang eines B-Baum-Pfads: Kosten = Tiefe · RandSeitenKosten. RandSeitenKosten typischerweise 4,0 für Random-I/O.

Abfragekosten Index Scan
01 · Eingabe

Abfragekosten Index Scan berechnen

Geschätzte Kosten eines Index-Scans entlang eines B-Baum-Pfads: Kosten = Tiefe · RandSeitenKosten. RandSeitenKosten typischerweise 4,0 für Random-I/O.

Lösen für
Kosten = Tiefe · RandSeitenKosten

Worum geht es?

Ein Index Scan läuft den B-Baum von der Wurzel bis ins Blatt und holt pro Ebene eine Seite per Random-I/O. Die einfache Kostenformel multipliziert die Indextiefe mit den Kosten pro Random-Seite — in PostgreSQL ist random_page_cost per Default 4,0, also viermal so teuer wie eine sequentielle Seite.

Die Formel modelliert nur die Indexnavigation, nicht das Nachladen der Tupel aus dem Heap. Für Index-Only-Scans oder Punkt-Abfragen ist sie aber eine vernünftige untere Schranke — und ergibt zusammen mit dem Sequential-Scan-Kostenmodell den klassischen Entscheidungsraum des Optimizers.

Die Formel

Formel Index Scan
Kosten = Tiefe · RandSeitenKosten

Umstellungen:
    Tiefe            = Kosten / RandSeitenKosten
    RandSeitenKosten = Kosten / Tiefe

Die Variablen

SymbolBedeutungEinheitErklärung
TiefeIndextiefeTiefe des B-Baum-Index.
RandSeitenKostenRandom-I/O-KostenKosten pro Random-Seite (z. B. 4,0).
KostenGesamtkostenGeschätzte Abfragekosten.

Minimal-Beispiel

Indextiefe 3, random_page_cost = 4,0:

Rechnung Punkt-Abfrage
Kosten = 3 · 4,0
       = 12,0

Praxis-Beispiele

Beispiel 1 — Tiefer Index

Bei 1 Mrd Zeilen und Fan-out 500 ergibt sich Tiefe 4:

Rechnung Tiefe 4
Kosten = 4 · 4,0
       = 16,0

Beispiel 2 — SSD-getuntes Kostenmodell

Auf SSDs ist Random-I/O nicht mehr 4× teurer als sequentiell. Mit random_page_cost = 1,1:

Rechnung SSD
Kosten = 4 · 1,1
       = 4,4

Auf modernen Storage-Setups setzt man random_page_cost typischerweise auf 1,1–1,5 — der Optimizer wählt dann häufiger Index-Pläne.

Beispiel 3 — Bruch- vs. Vollscan

100.000-Seiten-Tabelle, Sequential-Scan = 100.000. Index liefert ca. 0,1 % der Zeilen (≈ 100 Heap-I/Os) plus Indexnavigation:

Rechnung Selektive Abfrage
Index-Navigation = 4 · 4,0          = 16
Heap-I/O         = 100 · 4,0        = 400
Summe            ≈ 416

Optimizer wählt Index Scan
(416 ≪ 100 000).