锁定和解锁表/schema 统计信息
Oracle统计信息命令
-- 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');作用
锁定统计信息防止变更;自动任务会跳过已锁定的对象,表级 GATHER 调用会报 ORA-20005。force=>TRUE 可在不解除锁定的情况下收集。
适用场景
用于在白天被清空并重新填充的暂存/易变表上保留有代表性的统计信息、保护关键表的计划不受统计信息变化影响,或保留用 DBMS_STATS.SET_TABLE_STATS 设置的值。
注意
无需许可。被锁定的统计信息会随时间偏离实际,导致基数错误;请定期报告已锁定的对象。schema 级锁定不覆盖之后加入该 schema 的表。在已锁定的表上,CREATE/REBUILD INDEX 也不会自动收集索引统计信息。