SQL执行计划变动致使数据库负载突升。Oracle的CBO模式会根据字段的取值比重调整对应的执行计划,不管如何,都会选择成本值最低的一个执行计划,这也是CBO优于之前RBO的地方,这里仅用于实验,由于通常OLTP的应用会使用绑定变量的写法,不会像上面这种使用常量值的写法,11g以前,可能带来的一些负面影响就是绑定变量窥探的做用,即对于使用绑定变量窥探的SQL语句,Oracle会根据第一次执行使用的绑定变量值来用于之后的执行,即第一次作硬解析的时候,窥探了变量值,以后的软解析,再也不窥视,换句话说,若是上面实验的SQL语句使用了绑定变量,第一次执行时name=’A’(99.9%),则接下来即便使用name=’B’(0.1%)的SQL语句仍会使用全表扫描,不会选择索引扫描,vice versa。相关的实验dbsnake的书中会有很详细的说明,能够参考。11g以后,有了ACS自适应游标的新特性,会根据绑定变量值的状况能够从新生成执行计划,所以这种问题获得了缓解,固然这些都是有代价的,缓解了绑定变量窥探的反作用,相应地可能会致使有不少子游标,具体的算法能够参考dbsanke的书。11g默认绑定变量窥探是开启的,由optim peek user binds隐藏参数控制算法
-- 1.查询当前在活动的会话得到SQL_ID值 select a.USERNAME, a.SQL_ID, a.SID, a.MACHINE, a.PROGRAM, a.sql_hash_value, a.blocking_session_status from v$session a where a.status = 'ACTIVE' AND a.SCHEMA# > 0; -- 2.得到此sql_id对应的sql语句 select sql_id, sql_fulltext from v$sql where sql_id = '9j2c5zhzvsfd7'; -- 3.查询此sql_id历史执行信息 select a.INSTANCE_NUMBER, a.snap_id, a.sql_id, a.plan_hash_value, b.begin_interval_time from dba_hist_sqlstat a, dba_hist_snapshot b where sql_id = '9j2c5zhzvsfd7' and a.snap_id = b.snap_id order by instance_number, snap_id; -- 4.查询变动先后的执行计划 select sql_id, plan_hash_value, id, operation, options, object_owner, object_name, depth, cost, timestamp from DBA_HIST_SQL_PLAN where sql_id = 'dxx8pvcttf5qv' and plan_hash_value in (1904478120, 2125777269); -- 5.根据执行计划的不一样点查找缘由-使用coe_xfr_sql_profile.sql能够发现两种执行计划的效率(AVG_ET_SECS) select * from dba_objects where object_name = 'MOD_LOTHISTORY_IDX01' and owner = 'MDWMGR' order by last_ddl_time desc;