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

Настроить инкрементальную статистику для секционированной таблицы

OracleСтатистика

Команда

-- 1) Enable incremental mode (global statistics are derived from partition synopses):
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_PART', 'INCREMENTAL', 'TRUE');
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_PART', 'INCREMENTAL_STALENESS', 'USE_STALE_PERCENT');
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_PART', 'GRANULARITY', 'AUTO');

-- 2) The first gather scans everything and builds synopses; later ones read only changed partitions:
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'CUSTOMER_APP', tabname => 'SALE_PART');

-- 3) Verify:
SELECT DBMS_STATS.GET_PREFS('INCREMENTAL', 'CUSTOMER_APP', 'SALE_PART') AS incremental FROM dual;
SELECT partition_name, num_rows,
       TO_CHAR(last_analyzed,'YYYY-MM-DD HH24:MI:SS') AS last_analyzed, stale_stats
FROM   dba_tab_statistics
WHERE  owner = 'CUSTOMER_APP' AND table_name = 'SALE_PART'
ORDER  BY partition_position NULLS FIRST;

-- 4) Pre-build synopses on a staging table to be loaded via exchange (12c+):
-- EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_STAGE', 'INCREMENTAL', 'TRUE');
-- EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'SALE_STAGE', 'INCREMENTAL_LEVEL', 'TABLE');
-- EXEC DBMS_STATS.GATHER_TABLE_STATS('CUSTOMER_APP', 'SALE_STAGE');

Что делает

В инкрементальном режиме для каждой секции хранится synopsis; глобальная статистика (уровня таблицы), в частности NDV, вычисляется слиянием synopsis без повторного сканирования всей таблицы. Повторно читаются только изменённые секции.

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

На больших (масштаба TB) таблицах с секционированием range/interval, где новые данные попадают только в последние секции, когда сбор глобальной статистики не укладывается в окно обслуживания.

Внимание

Собственной лицензии нет, но уже требуется опция Partitioning (платная, EE). Synopsis занимают место в SYSAUX (формат HyperLogLog в 12.2+ значительно компактнее). Первый сбор — полное сканирование; запускайте его в окне обслуживания. Установка ESTIMATE_PERCENT в любое значение, кроме AUTO_SAMPLE_SIZE, отключает инкрементальный режим.

Открыть в DBAtlas →

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