在生产环境中,随着数据量的变化、查询条件的不同,有时执行计划发生了突变而导致SQL性能急剧下降。此时如果调整代码,或者修改业务逻辑,一方面时间上可能来不及,另一方面可能成本较高,那么有没有办法,可以在不调整代码或业务逻辑的情况下,让SQL语句使用计划突变之前的执行计划呢?本篇将介绍通过SQL_PROFILE来固化执行计划的三种方法。
一 绑定已存在的执行计划
DECLARE
v_ar_profile_hints sys.sqlprof_attr;
v_clsql_text CLOB;
BEGIN
SELECT extractvalue(VALUE(d), '/hint') AS outline_hints
BULK COLLECT
INTO v_ar_profile_hints
FROM xmltable('/*/outline_data/hint' passing
(SELECT xmltype(other_xml) AS xmlval
FROM dba_hist_sql_plan
WHERE sql_id = 'fzbu6pashquvv'
AND plan_hash_value = '116091679'
AND other_xml IS NOT NULL)) d;
SELECT sql_text
INTO v_clsql_text
FROM dba_hist_sqltext
WHERE sql_id = 'fzbu6pashquvv';
dbms_output.put_line(v_clsql_text);
dbms_sqltune.import_sql_profile(sql_text => v_clsql_text,
profile => v_ar_profile_hints,
NAME => '