カーソルキャッシュから良好な計画をSQL計画ベースラインとしてロード
Oracleパフォーマンスコマンド
-- 1) Compare the SQL's plans and their performance:
SELECT sql_id, child_number, plan_hash_value, executions,
ROUND(elapsed_time/1e3/NULLIF(executions,0),1) AS ms_per_exec,
sql_plan_baseline
FROM v$sql
WHERE sql_id = '<sql_id>';
-- 2) Load the chosen plan as a baseline:
SET SERVEROUTPUT ON
DECLARE
n PLS_INTEGER;
BEGIN
n := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => '<sql_id>',
plan_hash_value => <plan_hash_value>,
fixed => 'NO',
enabled => 'YES');
DBMS_OUTPUT.PUT_LINE(n || ' plan(s) loaded');
END;
/
-- 3) Verify the baseline:
SELECT sql_handle, plan_name, origin, enabled, accepted, fixed, reproduced,
TO_CHAR(last_executed,'YYYY-MM-DD HH24:MI') AS last_exec
FROM dba_sql_plan_baselines
WHERE signature = (SELECT exact_matching_signature FROM v$sql
WHERE sql_id = '<sql_id>' AND ROWNUM = 1);
-- On subsequent executions v$sql.sql_plan_baseline should be populated.概要
SQL計画管理を使用して選択した計画をACCEPTEDのベースラインにする。以降オプティマイザは受入れ済みのベースライン計画のみを使用し、新たに見つかった計画は展開(evolve)されるまで保留する。
使用する場面
計画劣化時に既知の良好な計画へ戻すため、アップグレードや統計変更の前に重要なSQLの計画を保護するため。
注意
Enterprise Editionでは追加ライセンス不要(SE2ではSQLごとに1つのベースライン計画に制限)。ADMINISTER SQL MANAGEMENT OBJECTが必要。ベースラインは完全に同一のSQLテキスト(シグネチャ)に適用され、リテラルを使用するSQLには効果がない。計画で使用されるインデックスが削除されると計画を再現できず(REPRODUCED=NO)、オプティマイザはコストベースの選択に戻る。OPTIMIZER_USE_SQL_PLAN_BASELINESはTRUE(デフォルト)である必要がある。