統計を保留(pending)として収集し、テストして公開
Oracle統計情報コマンド
-- 1) Disable publishing for the table (new statistics go to pending):
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'ORDERS', 'PUBLISH', 'FALSE');
EXEC DBMS_STATS.GATHER_TABLE_STATS('CUSTOMER_APP', 'ORDERS');
-- 2) Compare pending and published values:
SELECT owner, table_name, partition_name, num_rows,
TO_CHAR(last_analyzed,'YYYY-MM-DD HH24:MI') AS last_analyzed
FROM dba_tab_pending_stats
WHERE owner = 'CUSTOMER_APP';
SELECT num_rows, last_analyzed FROM dba_tables
WHERE owner = 'CUSTOMER_APP' AND table_name = 'ORDERS';
-- 3) Try plans with pending statistics in this session only:
ALTER SESSION SET optimizer_use_pending_statistics = TRUE;
EXPLAIN PLAN FOR SELECT COUNT(*) FROM customer_app.orders WHERE status = 7;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(format => 'BASIC +ROWS'));
ALTER SESSION SET optimizer_use_pending_statistics = FALSE;
-- 4a) If good, publish:
EXEC DBMS_STATS.PUBLISH_PENDING_STATS('CUSTOMER_APP', 'ORDERS', no_invalidate => FALSE);
-- 4b) If bad, discard:
-- EXEC DBMS_STATS.DELETE_PENDING_STATS('CUSTOMER_APP', 'ORDERS');
-- 5) Return to normal behavior:
EXEC DBMS_STATS.SET_TABLE_PREFS('CUSTOMER_APP', 'ORDERS', 'PUBLISH', 'TRUE');概要
PUBLISH=FALSE設定では、収集した統計はディクショナリではなく保留領域に書き込まれるため、他のセッションに影響しない。optimizer_use_pending_statisticsを使用したテストセッションで計画を検証し、1コマンドで公開または破棄する。
使用する場面
本番の重要なOLTP表で、更新した統計の計画への影響をリスクなくテストするため。大量データロード後の制御された切り替えに。
注意
ライセンス不要。PUBLISH=FALSEのままだと、自動タスクが収集した統計も保留として蓄積され、公開されない。設定をTRUEに戻すのを忘れない。EXPLAIN PLANは推定であるため、可能であればクエリを実行してDISPLAY_CURSORを確認する。