Ein Statistiklauf kann die Kardinalitätsschätzung des Optimizers verändern und damit auch Ausführungspläne. Bei großen oder geschäftskritischen Tabellen möchten DBAs deshalb oft erst sehen, wie neue Statistiken auf konkrete Abfragen wirken. Oracle kann frisch gesammelte Statistiken als „pending“ speichern. Der Cost Based Optimizer nutzt sie standardmäßig nicht; eine Testsession kann sie gezielt einschalten.
Pending Statistics für eine Tabelle aktivieren
Die Preference PUBLISH steuert, ob neue Statistiken sofort veröffentlicht werden. Für einen kontrollierten Test setzen Sie sie nur am betroffenen Objekt auf false und sammeln die Statistiken:
BEGIN
DBMS_STATS.SET_TABLE_PREFS(
ownname => 'APP',
tabname => 'ORDERS',
pname => 'PUBLISH',
pvalue => 'false'
);
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'APP',
tabname => 'ORDERS'
);
END;
/
Damit liegen die neuen Werte als pending vor, während die bisher veröffentlichten Statistiken für normale Sessions maßgeblich bleiben. Prüfen Sie die Preference und den Status nach dem Lauf, damit klar ist, dass Sie tatsächlich den gewünschten Testzustand erzeugt haben.
Auswirkung in einer isolierten Session vergleichen
Schalten Sie die Verwendung der pending Werte nur in einer dedizierten Testsitzung ein:
ALTER SESSION SET optimizer_use_pending_statistics = TRUE;
Führen Sie anschließend repräsentative SQL-Anweisungen aus und vergleichen Sie Plan, Laufzeit, Reads und Ergebnis mit der Baseline ohne die Session-Einstellung. Ein einzelner Explain Plan reicht für eine belastbare Entscheidung meist nicht: Bind-Werte, Datenverteilung und reale Last können das Bild verändern. Der Session-Schalter beeinflusst Abfragen, für deren Objekte pending Statistiken vorliegen, und sollte daher nicht unbedacht in einer allgemeinen Anwendungssession aktiviert werden.
Gezielt veröffentlichen oder verwerfen
Ist das Ergebnis überzeugend, veröffentlichen Sie die Statistiken ausdrücklich für das geprüfte Objekt:
BEGIN
DBMS_STATS.PUBLISH_PENDING_STATS(
ownname => 'APP',
tabname => 'ORDERS'
);
END;
/
Falls Pläne oder Laufzeiten schlechter werden, können die pending Statistiken mit DBMS_STATS.DELETE_PENDING_STATS entfernt werden. Setzen Sie danach die Objekt-Preference PUBLISH wieder auf true, wenn künftige Statistikläufe für diese Tabelle wieder automatisch publizieren sollen. Sonst sammeln spätere Jobs erneut pending Werte und lassen die veröffentlichten Statistiken unverändert.
Praktischer Ablauf
- Nur die betroffene Tabelle oder klar abgegrenzte Objekte auf
PUBLISH = falsesetzen. - Statistiken sammeln und die pending Werte kontrollieren.
- Typische SQL-Aufrufe in einer Testsession mit und ohne Pending-Parameter vergleichen.
- Bei Erfolg gezielt publizieren, bei Problemen löschen.
- Die ursprüngliche Preference wiederherstellen und Planänderungen überwachen.
Pending Statistics sind ein einfacher Freigabeschritt zwischen Statistikjob und produktiver Nutzung. Sie ersetzen kein Regressionstesting, schaffen aber einen kontrollierten Weg, Planänderungen vor dem allgemeinen Einsatz sichtbar zu machen.
Weiterführend: Oracles DBMS_STATS-Referenz zu Pending Statistics und die Anleitung zum Kontrollieren der Verwendung von Optimizer-Statistiken.