DBAtlas · Atlas für Datenbankbetrieb

Erweiterte Statistiken für korrelierte Spalten anlegen (CREATE STATISTICS)

PostgreSQLWartung

Befehl

-- city and district are correlated: the planner assumes independence and underestimates rows
CREATE STATISTICS customer_city_district_stx (dependencies, ndistinct, mcv) ON city, district FROM customer;
ANALYZE customer;

-- Collected statistics
SELECT statistics_name, attnames, kinds, n_distinct, dependencies
FROM pg_stats_ext
WHERE tablename = 'customer';

-- Verify: estimated rows should now be close to actual rows
EXPLAIN (ANALYZE, TIMING OFF)
SELECT * FROM customer WHERE city = 'Ankara' AND district = 'Cankaya';

Was es tut

Bringt dem Planner spaltenübergreifende Korrelation bei (funktionale Abhängigkeiten, kombinierte Distinct-Anzahlen, gemeinsame häufigste Werte); korrigiert Zeilenschätzungen für WHERE- und GROUP-BY-Bedingungen über mehrere Spalten.

Wann einsetzen

Wenn EXPLAIN ANALYZE bei Filtern über mehrere Spalten weit weniger geschätzte als tatsächliche Zeilen zeigt (z. B. 12 vs. 570) und deshalb eine falsche Join-Methode/ein falscher Index gewählt wird.

Vorsicht

Wirkt erst nach ANALYZE. Liegt die Anzahl der Spaltenkombinationen weit über dem Statistikziel (Standard 100), kann die mcv-Liste die meisten nicht abdecken, und mcv korrigiert dann eventuell eine Schätzung nicht, die dependencies korrigieren würde. Mit EXPLAIN prüfen; bei Bedarf mcv aus der Definition entfernen oder das Ziel anheben mit ALTER STATISTICS customer_city_district_stx SET STATISTICS 1000;. dependencies wird nur für Gleichheits-/IN-Bedingungen genutzt, ndistinct für GROUP-BY-Schätzungen. Jede Definition verlängert ANALYZE; füge sie nur Spaltengruppen mit nachgewiesener Fehlschätzung hinzu.

In DBAtlas öffnen →

Verwandte Einträge