生产数据库中经常出现SQL语句走错执行计划的情况,如果该sqlid还有其他高效的执行计划,可以通过coe_xfr_sql_profile.sql脚本进行绑定,但是如果sqlid没有高效的执行计划,就需要通过自己手工生成一个执行计划(通过加hint,或者其他方法),然后将手工生成的 执行计划绑定到生产中运行的sqlid上,下面就演示下具体方法:
–下面SQL正常走ob.object_id列上的索引IDX1_OB
select ob.owner,ob.object_name from ob,tt where ob.object_id = tt.object_id and tt.name = ‘a255’;
通过baseline绑定到下面SQL语句的执行计划上
select /+full(ob)/ ob.owner,ob.object_name from ob,tt where /fengsongtao/ ob.object_id = tt.object_id and tt.name = ‘a255’;
1、查看当前sql的SQL_ID和PLAN_HASH_VALUE
select sql_id,plan_hash_value,sql_text,parse_calls,executions from v$sql where sql_text like ‘select ob.owner,ob.object_name from ob,tt where ob.object_id = tt.object_id and%’;
SQL_ID: cw9ykcy4nxagr
PLAN_HASH_VALUE: 4294070672
2、根据上面的SQL_ID和PLAN_HASH_VALUE生成SQL_HANDLE
–创建baseline
declare
l_pls number;
begin
l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => ‘cw9ykcy4nxagr’,
plan_hash_value => 4294070672,
enabled => ‘NO’); --注意这里是no
end;
/
–查看生成的baseline
select sql_handle,
plan_name,
origin,
enabled,
accepted,
fixed,
creator,
optimizer_cost,
sql_text
from dba_sql_plan_baselines
where origin = ‘MANUAL-LOAD’<