Oracle Database · · 3 Min.

Inkrementelle Statistiken für Partitionen

Wie DBMS_STATS globale Optimizer-Statistiken pflegt, ohne regelmäßig die ganze Tabelle zu scannen.

Bei großen partitionierten Tabellen kann das regelmäßige Sammeln globaler Optimizer-Statistiken teuer werden, obwohl sich nur die jüngste Partition geändert hat. Mit inkrementeller Statistikpflege kann DBMS_STATS Statistiken geänderter Partitionen und zugehörige Synopsen verwenden, um globale Werte abzuleiten. So muss für die globale Pflege nicht jedes Mal die gesamte Tabelle gelesen werden.

Wofür Synopsen wichtig sind: Manche globalen Kennzahlen lassen sich nicht einfach aus Partitionswerten addieren. Die Anzahl unterschiedlicher Werte (NDV) kann sich zwischen Partitionen überschneiden. Synopsen helfen Oracle, solche globalen Werte genauer zusammenzuführen.

1. Inkrementelle Pflege für die Tabelle aktivieren

Die Einstellung erfolgt als tabellenspezifische Preference. Prüfen Sie zuerst die aktuelle Konfiguration und aktivieren Sie sie gezielt für partitionierte Tabellen, bei denen ein vollständiger Scan der globalen Statistik regelmäßig teuer ist:

BEGIN
  DBMS_STATS.SET_TABLE_PREFS(
    ownname => 'APP',
    tabname => 'SALES',
    pname   => 'INCREMENTAL',
    pvalue  => 'TRUE'
  );
END;
/

Danach sammeln Sie Statistiken wie gewohnt, beispielsweise mit GATHER_TABLE_STATS und der Granularität AUTO. Für die inkrementelle globale Pflege sind außerdem veröffentlichte Statistiken und AUTO_SAMPLE_SIZE relevant. Prüfen Sie diese Einstellungen für die eingesetzte Datenbankversion, statt sie für die gesamte Datenbank ungeprüft zu verändern.

2. Laufende Partitionen und Partition Exchange

In einem typischen Ladeprozess kommt regelmäßig eine neue Zeitpartition hinzu. Mit aktiver inkrementeller Pflege benötigt Oracle für die globale Statistik vor allem Informationen über die geänderte Partition und kann die vorhandenen Synopsen weiterverwenden. Bei einem Partition Exchange mit einer Staging-Tabelle ist ein zusätzlicher Schritt wichtig: Die Staging-Tabelle kann mit INCREMENTAL_LEVEL = TABLE vorbereitet und mit Statistiken versehen werden, damit Synopsen beim Austausch verfügbar sind.

Ein Schemawechsel oder geänderte Datenverteilungen können trotzdem eine umfassendere Statistikpflege sinnvoll machen. Inkrementell bedeutet nicht, dass ein vollständiger Refresh nie mehr nötig ist.

3. Betriebsfolgen messen und überwachen

Synopsen benötigen zusätzlichen Speicher, unter anderem im Tablespace SYSAUX. Beobachten Sie daher Speicherbedarf, Dauer der Statistikläufe und Planqualität wichtiger Abfragen. Vergleichen Sie repräsentative Ausführungspläne vor und nach der Aktivierung, besonders wenn globale NDVs oder Verteilungen für die Kardinalitätsschätzung wichtig sind.

  1. Tabellen mit vielen Partitionen und hohem Aufwand für globale Statistiken identifizieren.
  2. INCREMENTAL zunächst tabellenweise setzen und Speicherbedarf für Synopsen einplanen.
  3. Statistiklauf mit AUTO_SAMPLE_SIZE und passender Granularität testen.
  4. Partition-Exchange-Prozesse bei Bedarf mit INCREMENTAL_LEVEL auf der Staging-Tabelle ergänzen.
  5. SYSAUX, Laufzeiten und Abfragepläne nach dem Rollout kontrollieren.

Fazit

Inkrementelle Statistiken können die regelmäßige Pflege großer partitionierter Tabellen effizienter machen, indem sie Änderungen gezielt berücksichtigen und globale Werte aus Synopsen ableiten. Die Funktion ist besonders interessant bei periodischen Partition Loads. Ein kontrollierter Pilot, ein Blick auf SYSAUX und eine Prüfung der relevanten Ausführungspläne machen den Nutzen messbar.

Weiterführend: Oracles SQL Tuning Guide zu Optimizer-Statistiken und die DBMS_STATS-Referenz.