关于绑定sql的执行计划个人一直用的是oracle的sql plan baseline,其实oracle 10g就推出了sql profile来绑定执行计划,下面来简单的了解下oracle的sql profile的功能。 sql profile大体是实现两个功能: 1绑定现有sql的执行计划 2 在不修改代码的情况下使目
关于绑定sql的执行计划个人一直用的是oracle的sql plan baseline,其实oracle 10g就推出了sql profile来绑定执行计划,下面来简单的了解下oracle的sql profile的功能。
sql profile大体是实现两个功能:
1绑定现有sql的执行计划
2 在不修改代码的情况下使目标sql语句按照执行的执行计划执行,这两个功能sql plan baseline也是可以实现的,而比sql profile更加优秀的就是sql plan baseline还能够在sql运行是生成更优秀的执行计划基线,我们可以演练这个新的sql plan baseline来决定是否采用这个sql plan baseline。
sql profile有两种类型:一种是automatic类型,另一种是manual类型
automatic类型的sql profile是针对目标sql获取到一些额外的调整信息(类似oracle的动态采样来采集额外的信息),这些信息存储在数据字典中,当有了automatic类型的sql profile后,优化器产生执行计划时会根据目标sql所涉及统计信息等内容做相应的调整来保证选择最优的执行计划。
需要注意的automatic的sql profile并不是像stored outlines、sql plan baseline那样锁定目标sql的执行计划,automatic的sql profile在原则上只是提供了一些额外的统计信息,这些额外的统计信息必须于原目标sql的涉及的相关统计内容一起作用才能得到新的执行计划,如果原sql的统计信息等内容发生重大变化,即使原有的automatic类型的sql profile没有改变,该sql的执行计划也可能会发生变化,接下来xiaoyu会贴出部分case以供大家参考。
SQL>create table t_auto01 as select * from dba_objects;
SQL>本文来源gao($daima.com搞@代@#码(网5create index ind_objectid on t_auto01(object_id);
SQL> select max(object_id) from t_auto01;
MAX(OBJECT_ID)
————–
87823
SQL>update t_auto01 set object_id=100000 where object_id<87800;
SQL>commit;
SQL>exec dbms_stats.gather_table_stats(ownname=>USER,tabname=>’T_AUTO01′,cascade=>true);
SQL>set autotrace traceonly;
SQL> select /*+index(t_auto01 ind_objectid)*/* from t_auto01 where object_id=100000;
86366 rows selected.
Execution Plan
———————————————————-
Plan hash value: 4224651809
——————————————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
——————————————————————————————–
| 0 | SELECT STATEMENT | | 86348 | 8095K| 1388 (1)| 00:00:17 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_AUTO01 | 86348 | 8095K| 1388 (1)| 00:00:17 |
|* 2 | INDEX RANGE SCAN | IND_OBJECTID | 86348 | | 153 (0)| 00:00:02 |
——————————————————————————————–
Predicate Information (identified by operation id):
—————————————————
2 – access(“OBJECT_ID”=100000)
Statistics
———————————————————-
0 recursive calls
0 db block gets
12806 consistent gets
0 physical reads
0 redo size
9767726 bytes sent via SQL*Net to client
63850 bytes received via SQL*Net from client
5759 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
86366 rows processed