0Pricing
SQL Academy · Lektion

ANALYZE und pg_statistic

Halten Sie die Statistiken des Planers mit ANALYZE aktuell, untersuchen Sie pg_statistic und verwenden Sie erweiterte Statistiken für korrelierte Spalten.

ANALYZE und pg_statistic 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.

Warum ANALYZE?

Der Abfrageplaner muss Zeilenanzahlen und Selektivitäten schätzen, um einen guten Plan auszuwählen. Diese Schätzungen stammen aus spaltenbezogenen Statistiken, die von ANALYZE erfasst werden.

Wann sollte ANALYZE ausgeführt werden?

Autovacuum führt ANALYZE automatisch auf Grundlage von Schwellenwerten für Zeilenänderungen aus. Führen Sie ANALYZE nach umfangreichen Ladevorgängen oder großen DELETEs manuell aus, damit sich die Pläne nicht verschlechtern:

ANALYZE orders;
ANALYZE (VERBOSE) orders;

Stichproben

ANALYZE untersucht pro Spalte einige hundert Zeilen als Stichprobe. Passen Sie das Statistikziel an, wenn die Standardwerte zu schlechten Schätzungen führen:

ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.

pg_statistic

Der Systemkatalog, in dem die Statistiken gespeichert werden (verwenden Sie zur besseren Lesbarkeit die Sicht pg_stats):

SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';

Worauf der Planer achtet

  • n_distinct — Anzahl der unterschiedlichen Werte
  • most_common_vals — häufigste Werte und ihre Häufigkeiten
  • histogram_bounds — Klassen für Bereichsabfragen
  • correlation — physische gegenüber logischer Reihenfolge (beeinflusst die Kosten eines Scans)

Erweiterte Statistiken

Spaltenbezogene Statistiken erfassen keine Korrelationen zwischen Spalten. CREATE STATISTICS erfasst diese:

CREATE STATISTICS orders_country_status (dependencies)
  ON country, status FROM orders;
ANALYZE orders;

-- Now the planner knows that  country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').

Arten multivariater Statistiken

  • dependencies — funktionale Abhängigkeiten (eine Spalte sagt eine andere voraus)
  • ndistinct — Kombinationen unterschiedlicher Werte
  • mcv — häufigste kombinierten Werte (ab PG 12)

Schlechte Schätzungen → schlechte Pläne

Der häufigste Grund für die Frage „Warum ist meine Abfrage langsam?“ sind schlechte Zeilenschätzungen. Der Planer wählt Nested Loop, weil er mit einer Zeile rechnet; tatsächlich sind es 1.000.000.

EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.

ANALYZE in Migrationen erzwingen

Nach einem umfangreichen Ladevorgang:

COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.

Statistiken werden bei Datenverzerrungen nicht automatisch aktualisiert

Wenn sich die Daten von heute dramatisch von denen des Vortags unterscheiden, können die Statistiken veraltet bleiben, bis Autoanalyze ausgelöst wird. Führen Sie nach Änderungen an der Datenstruktur ANALYZE manuell aus.

pg_class.reltuples

Der Planer verwendet außerdem eine geschätzte Zeilenanzahl aus pg_class. Diese wird von VACUUM und ANALYZE aktualisiert. Sie lässt sich schnell überprüfen:

SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';

Zusammenfassung

ANALYZE liefert dem Planer Daten.

  • Führen Sie es nach umfangreichen Datenänderungen aus
  • Erhöhen Sie das STATISTICS-Ziel für verzerrte Spalten
  • Verwenden Sie CREATE STATISTICS für Spaltenkorrelationen
  • Eine große Differenz zwischen Schätzung und tatsächlichem Wert ist das Erste, was Sie beheben sollten

Kurzer Check

EXPLAIN ANALYZE zeigt bei einer WHERE-Bedingung auf einer einzelnen Spalte estimated rows=1, aber actual rows=500.000. Was ist die erste Maßnahme?

Häufig gestellte Fragen

Ist die Lektion „ANALYZE und pg_statistic“ kostenlos?

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

Halten Sie die Statistiken des Planers mit ANALYZE aktuell, untersuchen Sie pg_statistic und verwenden Sie erweiterte Statistiken für korrelierte Spalten. 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 „ANALYZE und pg_statistic“?

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