公众帐号:老虎刘谈SQL优化

作者介绍:老虎刘,原oracle 研发部门 Real-World Performance TEAM 成员,现在售后部门SSC专职做数据库性能优化,主要为银行、通信、证券、制造等大型企业提供服务。

比较

两个功能(以下简称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之间不是简单的优先级的问题,如果二者不冲突,则是合并使用;如果冲突,而且baseline可以reproduce(10053显示)时,使用baseline,否则使用profile。

如何验证profile是否生效?

很多时候SQL是在业务里面才能执行,可能还有很多的绑定变量,可以通过explain plan for SQL ,在select * from table(dbms_xplan.display)的note 部分,看看是不是有SQL profile “xxxxxxxxxxxxx” used for this statement 字样,如果有,表明profile已经绑定成功。

6、sql_id不一样会不会有影响?
profile识别的不是sql_id,而是signature,如果几个sql 只是在大小写、空格数、回车数或tab键有区别,那么这些SQL在系统中的signature就是一样的,可以使用同一个profile。