対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-083 対応
オプティマイザ統計(保留統計)難易度 標準無料

本番に影響を与えずに新しい統計を検証したい。次を実行した。

-- ① この表の統計を「保留(pending)」にする設定
SQL> EXEC DBMS_STATS.SET_TABLE_PREFS('HR','ORDERS','PUBLISH','FALSE');

-- ② 統計を収集
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('HR','ORDERS');

収集後、本番の通常セッションは依然として以前の(古い)統計に基づく実行計画のままだった。検証のために新しく収集した統計を、自分の検証セッションでだけオプティマイザに使わせたい。正しい操作を選べ。(単一選択)

  1. A収集と同時に新統計は全セッションへ公開されるはずなので、古い計画のままなのは別原因。SET_TABLE_PREFS は無関係
  2. B検証セッションで ALTER SESSION SET OPTIMIZER_USE_PENDING_STATISTICS = TRUE; を実行する。これでそのセッションだけ保留統計を使って計画を立てる。問題なければ DBMS_STATS.PUBLISH_PENDING_STATS で本公開する
  3. C検証セッションで ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS; を実行すれば保留統計が使われる
  4. D保留統計は SQL からは一切参照できず、PUBLISH_PENDING_STATS で公開するまでオプティマイザでもツールでも使えない
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BGold監修

解説

保留統計(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 で破棄。

これにより「新統計で計画が劣化しないか」を本番影響なしに先行検証できる。

各誤答が違う理由
  • APUBLISH=FALSE にしたので新統計は公開されず保留。だから通常セッションは古い統計のまま。SET_TABLE_PREFS はまさに原因(無関係ではない)。
  • COPTIMIZER_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 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
オプティマイザ統計 を含む全問を分野別に演習できます(無料)。
演習する →