Sequenzielle Scans vs. Index-Scans
Erkennen Sie, wann ein sequenzieller Scan ausreicht, wann ein Index-Scan erforderlich ist und wie der Planer entscheidet.
Sequenzielle Scans vs. Index-Scans ist eine kostenlose SQL Academy-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 Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Zwei Wege, Zeilen zu finden
Die Datenbank hat zwei grundlegende Strategien zum Lesen von Zeilen:
- Sequential Scan – liest jede Seite der Tabelle
- Index Scan – durchläuft einen Index und ruft passende Zeilen ab
Wann ein Sequential Scan sinnvoll ist
Wenn Sie ohnehin den größten Teil der Tabelle benötigen, ist ein Scan günstiger, als den Index zu lesen UND jede passende Zeile abzurufen. Als grobe Faustregel gilt: Bei mehr als etwa 10–20 % der Zeilen gewinnt der Sequential Scan.
Wann der Index Scan gewinnt
Bei selektiven Abfragen, die nur einen kleinen Teil der Zeilen betreffen, zahlt sich der Index aus:
EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey (cost=0.43..8.45 rows=1)
EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users (cost=0.00..15000.00 rows=950000)
-- (because most users are active)Index Scan vs. Index-Only Scan
Manchmal enthält der Index allein bereits alle benötigten Spalten – ein Abruf aus der Tabelle ist nicht erforderlich. Das ist ein Index-Only Scan:
CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);
EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idxBitmap Index Scan
Bei mittlerer Selektivität erstellt PostgreSQL möglicherweise eine Bitmap der passenden Zeilen und ruft sie anschließend in physischer Reihenfolge ab – schneller als zufällige I/O:
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
-- Recheck Cond: (status = 'pending')
-- -> Bitmap Index Scan on orders_status_idxWarum der Planer einen Sequential Scan auswählt
Häufige Gründe:
- Für die gefilterte Spalte gibt es keinen Index
- Der Index kann nicht verwendet werden (Funktion auf der Spalte, OR-Klauseln, inkompatible Datentypen)
- Die erwartete Zeilenanzahl ist zu hoch, als dass sich ein Index lohnen würde
- Die Statistiken sind veraltet und der Planer schätzt die Selektivität falsch ein
Indexverwendung erzwingen (mit Bedacht)
Sie können PostgreSQL nicht direkt per Hint steuern. Stattdessen:
- Führen Sie ANALYZE aus, um die Statistiken zu aktualisieren
- Fügen Sie den passenden Index hinzu
- Setzen Sie Sitzungsparameter:
SET enable_seqscan = off;zur Diagnose (nicht in der Produktion)
Indexierbare Prädikate
Damit ein Index hilft, muss die WHERE-Bedingung „sargable“ sein – die indizierte Spalte muss direkt verglichen werden:
-- GOOD:
WHERE created_at >= '2024-01-01'
-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'
-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'
-- FIX: add a functional index, or rewrite with range.Reihenfolge in zusammengesetzten Indizes
Ein Index auf (a, b) unterstützt Abfragen für a allein und für a AND b, aber nicht für b allein.
Die Indexgröße ist entscheidend
Ein schmaler B-tree-Index mit häufig verwendeten Schlüsselwerten kann vollständig im Speicher bleiben, ein breiter Index möglicherweise nicht. Kleinere Indizes sind schneller.
Plan überprüfen
Führen Sie nach dem Hinzufügen eines Index EXPLAIN ANALYZE aus, um zu bestätigen, dass der Planer ihn tatsächlich verwendet. Wenn nicht, untersuchen Sie die Ursache.
Zusammenfassung
Ob ein Sequential Scan oder ein Index Scan verwendet wird, hängt von der Selektivität ab.
- Selektiver Filter → Index Scan
- Der größte Teil der Tabelle → Sequential Scan
- Bitmap Scan für den Mittelbereich
- Auf Sargability achten
Kurztest
Warum könnte PostgreSQL trotz eines vorhandenen Index einen Sequential Scan auswählen?
Häufig gestellte Fragen
Ist die Lektion „Sequenzielle Scans vs. Index-Scans“ kostenlos?
Ja — der vollständige Text von „Sequenzielle Scans vs. Index-Scans“ 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 Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Sequenzielle Scans vs. Index-Scans“?
Erkennen Sie, wann ein sequenzieller Scan ausreicht, wann ein Index-Scan erforderlich ist und wie der Planer entscheidet. Du übst SQL Academy 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 Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy 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 „Sequenzielle Scans vs. Index-Scans“?
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 Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-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
- EXPLAIN und EXPLAIN ANALYZE lesen
- Sequenzielle Scans vs. Index-Scans
- Hash Join vs. Merge Join vs. Nested Loop
- Langsame Abfragen erkennen und beheben