0Pricing
SQL Academy · Lektion

Index-Only-Scans und Visibility Map

Ermöglichen Sie Index-Only-Scans, indem Sie Abfragen vollständig abdecken und die Visibility Map aktuell halten.

Index-Only-Scans und Visibility Map ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Was ist ein Index-Only Scan?

Normalerweise gibt eine Indexsuche Zeilen-IDs (TIDs) zurück, und die Tabelle muss besucht werden, um die tatsächliche Zeile zu lesen. Ein Index-Only Scan beantwortet die Abfrage ausschließlich anhand des Index — ohne Zugriff auf den Heap. Das ist deutlich schneller.

Voraussetzungen

Ein Index-Only Scan erfordert:

  • Alle ausgewählten Spalten müssen im Index enthalten sein
  • Die Seite der Zeile muss in der Visibility Map als „all visible“ markiert sein

Visibility Map

Eine Bitmap für jede Tabellenseite: Ein gesetztes Bit bedeutet, dass alle Zeilen auf dieser Seite für alle Transaktionen sichtbar sind. VACUUM hält sie aktuell. Ohne sie muss PostgreSQL den Heap besuchen, um die Sichtbarkeit zu prüfen.

Eine Abfrage zu einem Index-Only Scan machen

Decken Sie alle benötigten Spalten ab:

-- Query:
SELECT id, email FROM users WHERE id = 42;

-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.

INCLUDE

Ein abdeckender Index mit Nicht-Schlüsselspalten (ab PG 11). Die Spalte wird in den Blattknoten gespeichert, aber nicht für die Sortierung verwendet — dadurch entstehen keine zusätzlichen Kosten beim Einfügen:

CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);

SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.

Warum der Heap trotzdem besucht werden kann

Nach umfangreichen Schreibvorgängen kann die Visibility Map veraltet sein. Führen Sie VACUUM (ohne FULL) aus, um sie zu aktualisieren.

VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.

Index-Only Scans überprüfen

EXPLAIN zeigt dies an:

EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
--  Index Only Scan using users_id_email_idx on users
--    Index Cond: (id = 42)
--    Heap Fetches: 0       ← key number

Heap Fetches geben Aufschluss

„Heap Fetches: 0“ — perfekt, alle Daten stammen aus dem Index. „Heap Fetches: N“ — für N Zeilen war ein Zugriff auf den Heap erforderlich (das Bit der Visibility Map ist nicht gesetzt). Nach einem Autovacuum-Lauf sinkt die Anzahl der Heap Fetches normalerweise.

Wann INCLUDE statt eines zusammengesetzten Index verwendet werden sollte

  • Verwenden Sie INCLUDE für Spalten, die Sie nur SELECTen, nicht aber zum Filtern oder Sortieren verwenden
  • Verwenden Sie einen zusammengesetzten Schlüssel, wenn Sie auch nach der Spalte filtern oder sortieren

INCLUDE hält den Index schmaler und macht Schreibvorgänge schneller.

Index-Bloat beeinträchtigt Index-Only Scans

Aufgeblähte Indizes enthalten mehr Seiten, sodass selbst Index-Only Scans mehr Daten lesen. Halten Sie Indizes mit VACUUM sauber und indizieren Sie sie neu, wenn der Bloat zu groß wird.

Nicht alles abdecken

Wenn Sie einem Index zu viele Spalten hinzufügen, werden Schreibvorgänge langsam und der Index sehr groß. Decken Sie nur die häufig verwendeten Lesezugriffe ab.

Materialized Views als Abdeckung

Wenn Sie für einen bestimmten Bericht eine extrem hohe Lesegeschwindigkeit benötigen, ist eine materialisierte Sicht mit Index im Wesentlichen ein „abdeckender Index“ mit beliebigen berechneten Spalten.

Zusammenfassung

Index-Only Scan = schnellster Lesezugriff.

  • Alle ausgewählten Spalten müssen im Index enthalten sein
  • INCLUDE fügt kostengünstig Nicht-Schlüsselspalten hinzu
  • Die Visibility Map muss „all visible“ anzeigen — VACUUM hält sie aktuell
  • EXPLAIN: Heap Fetches: 0 ist das Ziel

Kurzer Check

In EXPLAIN sehen Sie trotz eines Index-Only-Scan-Knotens Heap Fetches: 100.000. Was ist die typische Lösung?

Häufig gestellte Fragen

Ist die Lektion „Index-Only-Scans und Visibility Map“ kostenlos?

Ja — der vollständige Text von „Index-Only-Scans und Visibility Map“ 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 „Index-Only-Scans und Visibility Map“?

Ermöglichen Sie Index-Only-Scans, indem Sie Abfragen vollständig abdecken und die Visibility Map aktuell halten. 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 4 von 4.

Wie lange dauert die Lektion „Index-Only-Scans und Visibility Map“?

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

  1. MVCC und Ursachen für Bloat
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE und pg_statistic
  4. Index-Only-Scans und Visibility Map
← Zurück zu SQL Academy