Veraltete Statistiken finden und Statistik-Präferenzen je Tabelle setzen (Prefs)
OracleStatistikenBefehl
-- 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).