パーティション表の増分統計を構成
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');概要
増分モードではパーティションごとにシノプシスが格納され、グローバル(表レベル)統計、特にNDVは、表全体を再スキャンせずにシノプシスのマージで計算される。変更されたパーティションのみが再度読み取られる。
使用する場面
新しいデータが最近のパーティションにのみ入る大規模(TB規模)なレンジ/インターバルパーティション表で、グローバル統計の収集がメンテナンスウィンドウを超えるとき。
注意
それ自体のライセンスは不要だが、Partitioningオプション(EEの有償オプション)がすでに必要。シノプシスはSYSAUX領域を消費する(12.2以降のHyperLogLog形式ははるかに小さい)。最初の収集はフルスキャンになるため、メンテナンスウィンドウで開始する。ESTIMATE_PERCENTをAUTO_SAMPLE_SIZE以外に設定すると増分が無効になる。