Tabellen-/Schemastatistiken sperren und entsperren
OracleStatistikenBefehl
-- Lock (the auto stats job and normal GATHER calls no longer touch them):
EXEC DBMS_STATS.LOCK_TABLE_STATS(ownname => 'CUSTOMER_APP', tabname => 'ORDERS');
EXEC DBMS_STATS.LOCK_SCHEMA_STATS(ownname => 'CUSTOMER_APP');
-- A single partition only: DBMS_STATS.LOCK_PARTITION_STATS('CUSTOMER_APP', 'SALE_PART', 'P2026_H1');
-- Locked objects:
SELECT owner, table_name, partition_name, stattype_locked
FROM dba_tab_statistics
WHERE owner = 'CUSTOMER_APP' AND stattype_locked IS NOT NULL;
-- Deliberate gathering while locked (instead of ORA-20005):
EXEC DBMS_STATS.GATHER_TABLE_STATS('CUSTOMER_APP', 'ORDERS', force => TRUE);
-- Unlock:
EXEC DBMS_STATS.UNLOCK_SCHEMA_STATS(ownname => 'CUSTOMER_APP');
EXEC DBMS_STATS.UNLOCK_TABLE_STATS(ownname => 'CUSTOMER_APP', tabname => 'ORDERS');Was es tut
Sperrt Statistiken gegen Änderungen; der automatische Task überspringt gesperrte Objekte, und ein GATHER-Aufruf auf Tabellenebene löst ORA-20005 aus. force=>TRUE erfasst, ohne die Sperre aufzuheben.
Wann einsetzen
Um repräsentative Statistiken auf Staging-/volatilen Tabellen zu halten, die tagsüber geleert und neu befüllt werden, die Pläne einer kritischen Tabelle vor Statistikänderungen zu schützen oder mit DBMS_STATS.SET_TABLE_STATS gesetzte Werte zu bewahren.
Vorsicht
Keine Lizenz erforderlich. Gesperrte Statistiken entfernen sich mit der Zeit von der Realität und verursachen Kardinalitätsfehler; berichte regelmäßig über gesperrte Objekte. Eine Schemasperre gilt nicht für Tabellen, die später zum Schema hinzukommen. Auf einer gesperrten Tabelle erfassen auch CREATE/REBUILD INDEX keine Indexstatistiken automatisch.