オプティマイザ統計(保留統計)難易度 標準無料
本番に影響を与えずに新しい統計を検証したい。次を実行した。
-- ① この表の統計を「保留(pending)」にする設定
SQL> EXEC DBMS_STATS.SET_TABLE_PREFS('HR','ORDERS','PUBLISH','FALSE');
-- ② 統計を収集
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('HR','ORDERS');
収集後、本番の通常セッションは依然として以前の(古い)統計に基づく実行計画のままだった。検証のために新しく収集した統計を、自分の検証セッションでだけオプティマイザに使わせたい。正しい操作を選べ。(単一選択)
- A収集と同時に新統計は全セッションへ公開されるはずなので、古い計画のままなのは別原因。
SET_TABLE_PREFSは無関係 - B検証セッションで
ALTER SESSION SET OPTIMIZER_USE_PENDING_STATISTICS = TRUE;を実行する。これでそのセッションだけ保留統計を使って計画を立てる。問題なければDBMS_STATS.PUBLISH_PENDING_STATSで本公開する - C検証セッションで
ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS;を実行すれば保留統計が使われる - D保留統計は SQL からは一切参照できず、
PUBLISH_PENDING_STATSで公開するまでオプティマイザでもツールでも使えない
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓Gold監修
解説
保留統計(pending statistics)は、収集した統計を即座に全体公開せず、“保留”として隔離しておき、検証してから公開する仕組みである。
DBMS_STATS.SET_TABLE_PREFS(...,'PUBLISH','FALSE')を設定した表では、以後のGATHER_..._STATSの結果は公開されず保留になる(DBA_TAB_PENDING_STATS等で確認可)。通常セッションは引き続き従来の公開済み統計を使うので、計画は変わらない。- 保留統計を使って計画を確かめたいセッションだけ
ALTER SESSION SET OPTIMIZER_USE_PENDING_STATISTICS = TRUE;を実行する。そのセッションに限りオプティマイザが保留統計を採用する。 - 検証して問題なければ
EXEC DBMS_STATS.PUBLISH_PENDING_STATS('HR','ORDERS');で公開(全体へ反映)。ダメならDBMS_STATS.DELETE_PENDING_STATSで破棄。
これにより「新統計で計画が劣化しないか」を本番影響なしに先行検証できる。
- A
PUBLISH=FALSEにしたので新統計は公開されず保留。だから通常セッションは古い統計のまま。SET_TABLE_PREFSはまさに原因(無関係ではない)。 - C
OPTIMIZER_MODEは最適化の目的(全行/初期行)を変えるだけで、保留統計の使用可否とは無関係。保留統計を使わせるのはOPTIMIZER_USE_PENDING_STATISTICS。 - D保留統計は
OPTIMIZER_USE_PENDING_STATISTICS=TRUEのセッションでオプティマイザが使用できるし、DBA_TAB_PENDING_STATS等のビューでも参照できる。「一切参照できない」は誤り。
ひっかけ: パラメータ名の取り違え。保留統計を使わせるのは
OPTIMIZER_USE_PENDING_STATISTICS であって OPTIMIZER_MODE ではない(C)。
また「統計を収集したら即全体に効く」という思い込み(A)。PUBLISH=FALSE なら公開されず保留。✓Gold 保有者による書き下ろし解説・実機で検証済