DBAtlas · Atlas für Datenbankbetrieb

Veraltete Statistiken finden und Statistik-Präferenzen je Tabelle setzen (Prefs)

OracleStatistiken

Befehl

-- 1) Flush DML counters to the dictionary and list stale objects:
EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;

SELECT owner, table_name, partition_name, num_rows,
       TO_CHAR(last_analyzed,'YYYY-MM-DD HH24:MI') AS last_analyzed,
       stale_stats, stattype_locked
FROM   dba_tab_statistics
WHERE  owner = 'CUSTOMER_APP'
  AND  (stale_stats = 'YES' OR last_analyzed IS NULL)
ORDER  BY table_name, partition_name;

SELECT table_name, partition_name, inserts, updates, deletes, truncated
FROM   dba_tab_modifications
WHERE  table_owner = 'CUSTOMER_APP';

-- 2) Per-table preferences (used by the auto stats job and manual GATHER calls):
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALES', 'STALE_PERCENT', '5');
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALES', 'METHOD_OPT', 'FOR ALL COLUMNS SIZE AUTO FOR COLUMNS SIZE 254 CUSTOMER_ID');
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALES', 'DEGREE', '4');

SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'CUSTOMER_APP', 'SALES') AS stale_pct FROM dual;
SELECT table_name, preference_name, preference_value
FROM   dba_tab_stat_prefs WHERE owner = 'CUSTOMER_APP';

-- 3) Gather only stale objects:
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'CUSTOMER_APP', options => 'GATHER STALE');
-- Revert a preference: EXEC DBMS_STATS.DELETE_TABLE_PREFS('CUSTOMER_APP', 'SALES', 'STALE_PERCENT');

Was es tut

Statistiken werden veraltet (stale), wenn der Änderungsanteil STALE_PERCENT (Standard 10 %) übersteigt. Präferenzen speichern je Tabelle Sampling, Histogramme, Parallelität und Stale-Schwellenwerte dauerhaft, sodass der nächtliche automatische Statistik-Task dieselben Regeln anwendet.

Wann einsetzen

Wenn die 10-%-Schwelle bei großen Tabellen zu spät greift, wenn bestimmte Spalten immer ein Histogramm bekommen müssen, und um die Erfassungsstrategie im Dictionary statt in Skripten festzulegen.

Vorsicht

Keine Lizenz erforderlich. Präferenzen werden durch explizite Parameter in einem manuellen GATHER-Aufruf überschrieben. Eine Änderung von METHOD_OPT fügt Histogramme hinzu oder entfernt sie und kann Pläne ändern. DBA_TAB_MODIFICATIONS ist erst nach einem Flush aktuell (automatischer Flush etwa alle 15 Minuten).

In DBAtlas öffnen →

Verwandte Einträge