Seq Scan, Index Scan und Index-Only
Warum der Planer jeweils diese Variante wählt und was sie über Ihre Abfrage aussagt.
Seq Scan, Index Scan und Index-Only ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Drei Möglichkeiten, eine Tabelle zu lesen
Wenn der Planner Zeilen aus einer Tabelle benötigt, wählt er eine von drei Zugriffsmethoden. Interviewer erwarten, dass Sie alle drei nennen können:
- Seq Scan, liest jede Zeile der Tabelle von Anfang bis Ende.
- Index Scan, durchläuft einen Index, um passende Zeilen zu finden, und ruft anschließend jede Zeile aus der Tabelle ab.
- Index-Only Scan, beantwortet die Abfrage vollständig aus dem Index, ohne die Tabelle überhaupt zu berühren.
Zu wissen, warum der Planner die jeweilige Methode auswählt, ist der Kern dieser Lektion und eine typische Frage für Senior-Entwickler.
Was ein Sequential Scan macht
Ein Seq Scan liest die Seiten der Tabelle nacheinander und wendet den Filter auf jede Zeile an. Ein Index wird nicht verwendet.
Das klingt zunächst schlecht, ist aber oft die richtige Wahl. Sequentielle Lesevorgänge sind für die Festplatte schnell (keine zufälligen Sprünge). Wenn eine Abfrage einen großen Anteil der Tabelle zurückgibt, ist das vollständige Scannen schneller, als millionenfach über einen Index zu springen.
Das Beispiel: Scannen Sie orders und behalten Sie die Zeilen, für die amount > 100 gilt. Wenn die meisten Bestellungen den Wert 100 überschreiten, ist ein Seq Scan die richtige Wahl.
EXPLAIN SELECT * FROM orders WHERE amount > 100;
Seq Scan on orders (cost=0.00..18334.00 rows=900000 width=64)
Filter: (amount > 100)Was ein Index Scan macht
Ein Index Scan verwendet einen B-Baum, um direkt zu passenden Schlüsseln zu springen, und liest anschließend die zugehörigen Zeilen aus dem Tabellen-Heap.
Seine Stärken zeigt er bei einem selektiven Filter, der nur einen kleinen Teil der Tabelle zurückgibt. Fünf Zeilen über einen Index zu suchen, ist schneller, als 10 Millionen Zeilen zu lesen.
Der Plan nennt den verwendeten Index. Jeder Treffer verursacht eine Indexsuche plus einen Heap-Lesevorgang (einen zufälligen Lesezugriff). Daher verlieren Index Scans ihren Vorteil, sobald sie zu viele Zeilen zurückgeben.
EXPLAIN SELECT * FROM orders WHERE customer_id = 42;
Index Scan using idx_orders_customer on orders
(cost=0.42..38.50 rows=12 width=64)
Index Cond: (customer_id = 42)Die Selektivität entscheidet über die Wahl
Der zentrale Begriff hinter all dem ist die Selektivität: welcher Anteil der Zeilen von einem Prädikat behalten wird.
- Hohe Selektivität (wenige Zeilen stimmen überein, etwa bei einer eindeutigen ID) spricht für einen Index Scan.
- Niedrige Selektivität (viele Zeilen stimmen überein, etwa bei
status IS NOT NULL) spricht für einen Seq Scan.
Eine verbreitete Faustregel: Sobald eine Abfrage mehr als ungefähr 5 bis 10 Prozent einer Tabelle zurückgibt, bevorzugt der Planner häufig einen Sequential Scan, weil die zufälligen Heap-Zugriffe eines Index teurer werden als das Lesen der gesamten Tabelle in Reihenfolge.
Der Index-Only Scan
Ein Index-Only Scan ist die schnellste der drei Methoden. Wenn jede von der Abfrage benötigte Spalte bereits im Index enthalten ist, greift die Engine überhaupt nicht auf den Tabellen-Heap zu.
Die Beispielabfrage wählt nur customer_id aus und filtert danach. Der Index befindet sich auf customer_id. Alle benötigten Daten liegen im Index, daher meldet Postgres Index Only Scan.
Dadurch werden die zufälligen Heap-Lesevorgänge vermieden, die einen gewöhnlichen Index Scan verlangsamen – ein großer Vorteil bei breiten Tabellen.
EXPLAIN SELECT customer_id FROM orders WHERE customer_id = 42;
Index Only Scan using idx_orders_customer on orders
(cost=0.42..8.44 rows=12 width=4)
Index Cond: (customer_id = 42)Der Haken mit der Visibility Map
Interviewer lieben diese Feinheit. Ein Index-Only Scan muss trotzdem bestätigen, dass jede Zeile für Ihre Transaktion sichtbar ist (MVCC); der Index allein speichert keine Sichtbarkeitsinformationen.
Postgres verwendet die visibility map: Wenn eine Seite als all-visible markiert ist, wird der Heap übersprungen. Andernfalls muss die Heap-Zeile trotzdem abgerufen werden. Der Plan zeigt Heap Fetches: N.
Deshalb kann eine gerade aktualisierte Tabelle viele Heap Fetches aufweisen und Index-Only Scans verlangsamen, bis VACUUM die Visibility Map aktualisiert.
Index Only Scan using idx_orders_customer on orders
(actual time=0.01..0.03 rows=12 loops=1)
Heap Fetches: 0Bitmap Scans: der Mittelweg
Eine vierte Methode taucht ebenfalls häufig auf: der Bitmap Heap Scan. Der Planner wählt ihn, wenn ein Prädikat mehr Zeilen betrifft, als ein gewöhnlicher Index Scan sinnvoll verarbeiten kann, aber weniger als die gesamte Tabelle.
Zuerst erstellt er aus dem Index eine Bitmap der Fundstellen passender Zeilen (Bitmap Index Scan). Anschließend ruft er die Heap-Seiten in physischer Reihenfolge statt in zufälliger Reihenfolge ab. Geordnete Zugriffe sind deutlich günstiger als die verstreuten Lesevorgänge eines normalen Index Scans.
Bitmap Heap Scan on orders (cost=12.0..520.0 rows=8000)
Recheck Cond: (status = 'pending')
-> Bitmap Index Scan on idx_orders_status
(cost=0..12 rows=8000)
Index Cond: (status = 'pending')Warum der Planner Ihren Index ignoriert
Eine klassische Frage im Vorstellungsgespräch lautet: Ich habe einen Index hinzugefügt, aber der Plan führt weiterhin einen Seq Scan aus – warum? Häufige Gründe:
- Das Prädikat ist nicht selektiv; ein Scan ist tatsächlich günstiger.
- Eine Funktion umschließt die Spalte:
WHERE lower(email) = ...kann keinen gewöhnlichen Index aufemailverwenden. - Eine Typinkongruenz erzwingt eine implizite Typumwandlung, die den Index unbrauchbar macht.
- Veraltete Statistiken; führen Sie
ANALYZEaus. - Die Tabelle ist sehr klein; das Scannen weniger Seiten ist schneller als der Index-Overhead.
Durchgearbeitete Diagnose
Angenommen, orders besitzt einen Index auf created_at, aber diese Abfrage verwendet trotzdem einen Seq Scan:
Der Grund ist DATE(created_at). Wenn die Spalte in eine Funktion eingeschlossen wird, kann der Index auf der unveränderten Spalte created_at nicht verwendet werden. Die Lösung besteht darin, die Abfrage in ein Bereichsprädikat umzuschreiben, das die Spalte unverändert lässt, oder einen Ausdrucksindex auf DATE(created_at) anzulegen.
-- Slow: function on the indexed column
WHERE DATE(created_at) = '2026-01-01'
-- Fast: bare column, range uses the index
WHERE created_at >= '2026-01-01'
AND created_at < '2026-01-02'Methoden im Vergleich
Behalten Sie diesen Vergleich für das Vorstellungsgespräch im Kopf:
- Seq Scan, am besten bei der Rückgabe eines großen Zeilenanteils; sequentielle I/O.
- Index Scan, am besten für selektive Suchen; Indexdurchlauf plus zufällige Heap-Zugriffe.
- Bitmap Heap Scan, für eine mittlere Anzahl passender Zeilen; Index zur Erstellung einer Bitmap, danach geordnete Heap-Lesevorgänge.
- Index-Only Scan, am schnellsten, wenn der Index jede benötigte Spalte abdeckt und alle Seiten als sichtbar markiert sind.
Der Planner entscheidet anhand der geschätzten Kosten, die hauptsächlich durch Selektivität und Statistiken bestimmt werden.
Einen Test erzwingen (und warum nicht in Produktion)
Um in der Entwicklung eine Annahme zu überprüfen, können Sie den Planner vorübergehend in eine Richtung lenken: SET enable_seqscan = off; zwingt ihn, Indizes zu bevorzugen, sodass Sie Pläne vergleichen können.
Das ist ein diagnostischer Trick und niemals eine Lösung für die Produktion. Erwähnen Sie im Vorstellungsgespräch, dass die echten Lösungen bessere Statistiken, ein geeigneter Index oder das Umschreiben des Prädikats sind – nicht das globale Deaktivieren von Planner-Funktionen.
SET enable_seqscan = off;
EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 100;
SET enable_seqscan = on;Kurze Überprüfung
Eine Abfrage wählt nur email aus und filtert nach email. Außerdem gibt es einen B-Baum-Index auf email. Der Plan zeigt Index Only Scan. Warum ist das schneller als ein gewöhnlicher Index Scan?
Zusammenfassung
Die wichtigsten Erkenntnisse zu Zugriffsmethoden:
- Seq Scan ist bei Abfragen mit niedriger Selektivität im Vorteil; Index Scan bei selektiven Abfragen.
- Index-Only Scan vermeidet den Heap, wenn der Index alle benötigten Spalten abdeckt. Achten Sie auf
Heap Fetchesund die Visibility Map. - Bitmap Heap Scan bildet den Mittelweg, indem Heap-Seiten in physischer Reihenfolge abgerufen werden.
- Der Planner entscheidet anhand von Selektivität und Statistiken. Funktionen auf Spalten, Typinkongruenzen und veraltete Statistiken sind die Gründe, warum ein Index ignoriert wird.
Häufig gestellte Fragen
Ist die Lektion „Seq Scan, Index Scan und Index-Only“ kostenlos?
Ja — der vollständige Text von „Seq Scan, Index Scan und Index-Only“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Seq Scan, Index Scan und Index-Only“?
Warum der Planer jeweils diese Variante wählt und was sie über Ihre Abfrage aussagt. Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Seq Scan, Index Scan und Index-Only“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einen EXPLAIN-Plan lesen
- Seq Scan, Index Scan und Index-Only
- Join-Algorithmen: Nested Loop, Hash, Merge
- Langsame Abfragen erkennen und beheben