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 berechnen
Geschätzte Kosten eines Index-Scans entlang eines B-Baum-Pfads: Kosten = Tiefe · RandSeitenKosten. RandSeitenKosten typischerweise 4,0 für Random-I/O.
- Kosten — Gesamtkosten
- Tiefe — Indextiefe
- RandSeitenKosten — Random-I/O-Kosten
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
Kosten = Tiefe · RandSeitenKosten
Umstellungen:
Tiefe = Kosten / RandSeitenKosten
RandSeitenKosten = Kosten / TiefeDie Variablen
| Symbol | Bedeutung | Einheit | Erklärung |
|---|---|---|---|
| Tiefe | Indextiefe | — | Tiefe des B-Baum-Index. |
| RandSeitenKosten | Random-I/O-Kosten | — | Kosten pro Random-Seite (z. B. 4,0). |
| Kosten | Gesamtkosten | — | Geschätzte Abfragekosten. |
Minimal-Beispiel
Indextiefe 3, random_page_cost = 4,0:
Kosten = 3 · 4,0
= 12,0Praxis-Beispiele
Beispiel 1 — Tiefer Index
Bei 1 Mrd Zeilen und Fan-out 500 ergibt sich Tiefe 4:
Kosten = 4 · 4,0
= 16,0Beispiel 2 — SSD-getuntes Kostenmodell
Auf SSDs ist Random-I/O nicht mehr 4× teurer als sequentiell. Mit random_page_cost = 1,1:
Kosten = 4 · 1,1
= 4,4Auf 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:
Index-Navigation = 4 · 4,0 = 16
Heap-I/O = 100 · 4,0 = 400
Summe ≈ 416
Optimizer wählt Index Scan
(416 ≪ 100 000).