从游标缓存将良好计划加载为 SQL plan baseline
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 Plan Management 将所选计划设为 ACCEPTED baseline;此后优化器只使用已接受的 baseline 计划,新发现的计划会搁置直到被演进(evolve)。
适用场景
在计划回归时回到已知的良好计划,以及在升级或统计信息变更前保护关键 SQL 的计划。
注意
Enterprise Edition 上无需额外许可(在 SE2 上每条 SQL 限一个 baseline 计划)。需要 ADMINISTER SQL MANAGEMENT OBJECT。baseline 仅适用于完全相同的 SQL 文本(signature);对使用字面量的 SQL 无效。如果计划使用的索引被删除,计划将无法重现(REPRODUCED=NO),优化器会退回基于成本的选择。OPTIMIZER_USE_SQL_PLAN_BASELINES 必须为 TRUE(默认)。