Oracle数据库中执行sql的时候,优化器会根据优化器统计信息和一些参数来生成“它认为最好的“执行计划。
但是并不能够保证每一次都会选择最优的哪个执行计划。如果遇到了sql语句在一定时间段执行时性能变差,
并且发现它的执行计划发生了变化,那么可以考虑固定哪个”好的”时候的执行计划。
当然,必须保证sql语句没有被修改,是同一个sql。
- SQL Plan Management (SQL计划管理,简称SPM)
这是Oracle推荐使用的一种方法。使用起来也很简单。以下是一个手动固定的例子。
select * from dba_hist_sql_plan where sql_id = 'bxrrqvukjx2gj';
declare
aa pls_integer;
begin
aa := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => 'bxrrqvukjx2gj',PLAN_HASH_VALUE => '2727519825');
end;
select * from dba_sql_plan_baselines;
declare
res number;
begin
res := DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => 'SQL_5d441e2d4fb36e37',
plan_name => 'SQL_PLAN_5uj0y5p7v6vjr9c383af1',
attribute_name => 'FIXED',
attribute_value => 'YES'
);
end;