DBAtlas · Атлас эксплуатации баз данных

Заблокировать и разблокировать статистику таблицы/схемы

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 собирает статистику без снятия блокировки.

Когда использовать

Чтобы сохранить репрезентативную статистику на staging/изменчивых таблицах, которые в течение дня очищаются и заполняются заново, защитить планы критичной таблицы от изменений статистики или сохранить значения, заданные через DBMS_STATS.SET_TABLE_STATS.

Внимание

Лицензия не требуется. Заблокированная статистика со временем расходится с реальностью и вызывает ошибки кардинальности; регулярно формируйте отчёт по заблокированным объектам. Блокировка схемы не распространяется на таблицы, добавленные в схему позже. Для заблокированной таблицы CREATE/REBUILD INDEX также не собирает статистику индекса автоматически.

Открыть в DBAtlas →

Связанные материалы