0Pricing
SQL Academy · Lektion

Partielle Indizes und Ausdrucksindizes

Indizieren Sie mit WHERE-Klauseln nur die relevanten Zeilen und indizieren Sie berechnete Ausdrücke (lower(email), date_trunc('day', ts)).

Partielle Indizes und Ausdrucksindizes ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.

Partieller Index: Eine Teilmenge indizieren

Ein partieller Index erfasst nur Zeilen, die beim Erstellen des Index mit einer WHERE-Klausel übereinstimmen. Er ist kleiner, schneller und ideal für die häufigste Abfrage:

CREATE INDEX users_active_email_idx
  ON users(email)
  WHERE deleted_at IS NULL;

Wann partielle Indizes sinnvoll sind

Verwenden Sie sie, wenn:

  • Sie immer nach demselben Prädikat filtern (z. B. Soft-Delete)
  • Ein Wert in der Spalte dominiert (z. B. 95 % der Zeilen haben status='closed')
  • Sie einen kleinen, häufig verwendeten Index im Cache haben möchten

Beispiel: Aktive Sitzungen

Die meisten Sitzungen sind abgelaufen; nur aktive Sitzungen werden abgefragt:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.

Besser: Ein stabiles Prädikat verwenden

Das Indexprädikat muss immutable sein. Zeitabhängige Ausdrücke wie NOW() sind nicht geeignet. Verwenden Sie stattdessen eine Spalte wie is_active:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE is_active = true;

-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;

Ausdrucksindex

Indizieren Sie eine Funktion einer Spalte:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.

Häufige Ausdrucksindizes

  • LOWER(email) für die Suche ohne Beachtung der Groß-/Kleinschreibung
  • (price * tax_rate) für eine Sortierung nach berechnetem Wert
  • date_trunc('day', created_at) für Tagesberichte
  • (data ->> 'user_id')::BIGINT für JSONB-Extraktionen

Der Ausdruck muss IMMUTABLE sein

Der Ausdruck muss als IMMUTABLE gekennzeichnet sein – sein Ergebnis hängt ausschließlich von der Eingabe ab. RANDOM(), NOW() und CURRENT_USER sind nicht geeignet.

Kombination aus partiellem Index und Ausdrucksindex

Beides lässt sich kombinieren:

CREATE INDEX articles_active_title_idx
  ON articles(LOWER(title))
  WHERE published_at IS NOT NULL;

Eindeutige partielle Indizes

Das klassische Muster „eine aktive Zeile“:

CREATE UNIQUE INDEX users_one_active_email
  ON users(email)
  WHERE deleted_at IS NULL;

-- Same email can exist many times in deleted users, but only once active.

Das Indexprädikat muss zur Abfrage passen

Der Planner verwendet den partiellen Index nur, wenn die WHERE-Klausel der Abfrage das Indexprädikat „impliziert“:

-- Index:  WHERE is_active = true
-- Match:  WHERE is_active = true AND user_id = 42       ✓
-- Match:  WHERE is_active AND user_id = 42             ✓
-- No:     WHERE user_id = 42                           ✗
-- No:     WHERE is_active IS NOT FALSE                 ✗ (logically same but planner may not realise)

Nicht übermäßig verwenden

Viele partielle Indizes für disjunkte Teilmengen können Schreibvorgänge verlangsamen (jedes INSERT muss alle relevanten Indizes aktualisieren). Verwenden Sie sie sparsam für häufig ausgeführte Abfragen.

Zusammenfassung

Partielle Indizes und Ausdrucksindizes holen mehr Leistung aus jedem Byte.

  • Partiell: nur die abgefragte Teilmenge indizieren
  • Ausdruck: berechnete Werte indizieren
  • Beide erfordern IMMUTABLE-Ausdrücke
  • Die Abfrage muss dasselbe Prädikat verwenden, damit der Index passt

Kurztest

Sie möchten E-Mail-Adressen ohne Beachtung der Groß-/Kleinschreibung suchen. Welcher Index ist am effizientesten?

Häufig gestellte Fragen

Ist die Lektion „Partielle Indizes und Ausdrucksindizes“ kostenlos?

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

Indizieren Sie mit WHERE-Klauseln nur die relevanten Zeilen und indizieren Sie berechnete Ausdrücke (lower(email), date_trunc('day', ts)). 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 3 von 4.

Wie lange dauert die Lektion „Partielle Indizes und Ausdrucksindizes“?

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