0Pricing
SQL Academy · Lektion

Indexwartung und Bloat

Diagnostizieren Sie Index-Bloat, erstellen Sie Indizes mit REINDEX CONCURRENTLY neu und löschen Sie ungenutzte Indizes sicher.

Indexwartung und Bloat 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.

Warum Indizes aufgebläht werden

PostgreSQL verwendet MVCC: Ein UPDATE schreibt eine neue Zeilenversion und lässt die alte für bestehende Transaktionen sichtbar. Für beide Versionen existieren Indexeinträge. Mit der Zeit:

  • Bei Tabellen mit vielen Aktualisierungen sammeln sich tote Indexeinträge an
  • Indizes werden größer als nötig
  • Abfragen werden langsamer, weil der B-Baum tiefer wird

Bloat diagnostizieren

Abfragen zur Bloat-Prüfung sind nicht trivial. Häufig verwendete Werkzeuge:

  • Erweiterung pgstattuple
  • Berichte von pg_repack
  • Bloat-Abfragen aus check_postgres oder Monitoring-Tools
CREATE EXTENSION pgstattuple;
SELECT * FROM pgstatindex('orders_user_id_idx');

REINDEX

Erstellt den Index neu. Die klassische Variante nimmt eine ACCESS EXCLUSIVE-Sperre – in der Produktion problematisch:

REINDEX INDEX orders_user_id_idx;       -- blocks writes!

REINDEX CONCURRENTLY (PG 12+)

Die nicht blockierende Variante – Lese- und Schreibvorgänge laufen während der Neuerstellung weiter:

REINDEX INDEX CONCURRENTLY orders_user_id_idx;

Nicht verwendete Indizes

Ein nicht verwendeter Index verlangsamt jeden Schreibvorgang, beschleunigt aber keinen einzigen Lesevorgang. Finden Sie solche Indizes mit:

SELECT schemaname, relname, indexrelname, idx_scan, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE idx_scan = 0
  AND indexrelname NOT LIKE '%_pkey'
ORDER BY pg_relation_size(indexrelid) DESC;

Nicht verwendete Indizes löschen

Löschen Sie sie – prüfen Sie aber vorher alle Umgebungen und Zeiträume. Indizes, die gelegentliche Berichte unterstützen, wirken die meiste Zeit ungenutzt.

DROP INDEX CONCURRENTLY old_unused_idx;

Doppelte Indizes

Manchmal wird derselbe Index sowohl durch eine Constraint als auch durch ein manuelles CREATE INDEX erstellt. Prüfen Sie pg_indexes auf Duplikate und löschen Sie den überflüssigen Index:

SELECT tablename, indexname, indexdef
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename, indexname;

Schreibverstärkung durch Indizes

Jedes INSERT, UPDATE und DELETE aktualisiert jeden relevanten Index. Drei Indizes auf einer stark ausgelasteten Tabelle bedeuten die dreifachen Schreibkosten. Fügen Sie nur Indizes hinzu, die sich lohnen.

GIN-Pending-Liste

GIN-Indizes bündeln Aktualisierungen in einer Pending-Liste. Leeren Sie diese manuell oder verlassen Sie sich auf autovacuum:

SELECT gin_clean_pending_list('events_data_gin');

VACUUM bereinigt Indexeinträge

VACUUM (behandelt in der MVCC-Lektion) entfernt tote Indexeinträge von Heap-Seiten. Ohne autovacuum wachsen Indizes unbegrenzt.

Indexgröße überwachen

Verfolgen Sie die Indexgröße über die Zeit:

SELECT pg_size_pretty(pg_indexes_size('orders')) AS index_size,
       pg_size_pretty(pg_total_relation_size('orders')) AS total_size;

pg_repack: Tabellen online neu schreiben

Bei starkem Bloat schreibt pg_repack die Tabelle und Indizes online neu – ohne eine Sperre für die gesamte Tabelle. Installieren Sie es als Betriebssystempaket und als PostgreSQL-Erweiterung.

Zusammenfassung

Indizes brauchen Pflege.

  • Bloat durch MVCC ist normal – verwalten Sie ihn mit VACUUM und REINDEX CONCURRENTLY
  • Löschen Sie nicht verwendete Indizes
  • Vermeiden Sie Duplikate
  • Jeder neue Index verlangsamt Schreibvorgänge – gehen Sie bewusst damit um

Kurztest

Welcher PostgreSQL-Befehl erstellt einen Index neu, OHNE Schreibvorgänge zu blockieren?

Häufig gestellte Fragen

Ist die Lektion „Indexwartung und Bloat“ kostenlos?

Ja — der vollständige Text von „Indexwartung und Bloat“ 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 „Indexwartung und Bloat“?

Diagnostizieren Sie Index-Bloat, erstellen Sie Indizes mit REINDEX CONCURRENTLY neu und löschen Sie ungenutzte Indizes sicher. 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 „Indexwartung und Bloat“?

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. B-tree- vs. Hash- vs. GiST- vs. GIN-Indizes
  2. Zusammengesetzte Indizes und Spaltenreihenfolge
  3. Partielle Indizes und Ausdrucksindizes
  4. Indexwartung und Bloat
← Zurück zu SQL Academy