两个功能(以下简称profile和baseline)都能固定SQL的执行计划:
1、
profile是10g开始提供的功能,baseline是11g开始提供的功能
2、
profile只能固定一个执行计划;
baseline可以固定多个执行计划,如某sql有10个执行计划,可以使用baseline固定使用其中的2个,根据11g adaptive plan的特性,让优化器从这2个计划中自动选择,fixed属性为yes的执行计划优先被选择,可以设置多个计划的fixed=yes
3、
profile的执行计划可以直接从历史数据(AWR)里面load,baseline需要先把awr的数据load到STS(SQL Tuning Set),才能再load到baseline。所以一般生产系统执行计划突然变差的应急处理,多使用profile。
使用下面两个脚本做应急处理:
coe_load_sql_profile.sql
coe_load_sql_baseline.sql (如果好的执行计划还在cache,使用起来也与上面脚本一样方便)
4、
profile可以对未使用绑定变量的SQL进行执行计划绑定,如:
select xx from t1 where id=1;select xx from t1 where id=2等,
这样的sql一般只能使用profile绑定(选择其中任意一个sql_id,将force_match参数设置为true);而baseline不可以,如果要绑定,需要逐条sql_id进行绑定。如果将系统参数cursor_sharing改成FORCE,主要的SQL也可以使用baseline。
5、
profile优先级大于baseline,如果有profile存在,优先使用profile。
如何验证profile是否生效?
很多时候SQL是在业务里面才能执行,可能还有很多的绑定变量,可以通过explain plan for SQL ,在select * from table(dbms_xplan.display)的note 部分,看看是不是有SQL profile "xxxxxxxxxxxxx" used for this statement 字样,如果有,表明profile已经绑定成功。
sql_id不一样会不会有影响?
profile识别的不是sql_id,而是signature,如果几个sql 只是在大小写、空格数、回车数或tab键有区别,那么这些SQL在系统中的signature就是一样的,可以使用同一个profile。
本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!