在系统中有的时候,因为邦迪变量窥探的影响导致了sql走的行计划不好,需要重新窥探下,有2中方法:
1在表上执行ddl语句,可以让共享游标失效
comment on table t1 is 'for testing '
2在10.2.4以上,使用
dbms_shared_pool.purge,在10.2.4中使用的时候,需要设置event 5614566
alter session set events '5614566 trace name context forever'; 否则该存储过程不起作用。
在均衡的列上,选择率是固定的,所以对于绑定变量来说,即使不同值的窥探,他们使用的执行计划也都是相同的,同时也都是合理的,在非均衡的列上,要收集直方图,那么不同值的选择率可能是不同的,这样用不同的值窥探会产生不同的 执行计划,也就出现了绑定变量窥探的副作用,即后续的输入值一直沿用第一次窥探的计划。
11g的自适应游标就是用运行时的统计信息判断,输入的值的执行计划是否可能会发生改变,要是可能改变就触发次硬解析。自适应游标做的2件事情,1扩展游标共享,即将子游标标记为bind sensitive,也就是感觉含绑定变量的sql的执行计划可能会随着所传入的绑定变量输入值的变化而变化。
要满足下面的三个条件:
1 启用了绑定变量窥探
2该sql使用了绑定变量
3该sql使用了不安全的谓词条件,例如范围查询,列上有直方图的等值查询
第二件事情:将对应的子游标标记为bind aware,就是确定sql的执行计划会随着传入的绑定变量输入值的变化而变化。
满足下面的2个条件:
1子游标已经标记了bind sensitive
2sql在接下来连续2次执行时,运行时的统计信息与之前硬解析所对应的运行时统计信息差异较大。
自适应游标实验:
SQL> create index idx_t1 on t1(object_type);
索引已创建。
SQL> update t1 set object_type='TABLE' where rownum<60001;
已更新18533行。
SQL> update t1 set object_type='CLUSTER' where rownum<2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats(ownname=>'BAIXYU', tabname=>'T1',estimate_percent=>100, cascade =>true,method_opt=>'for all columns size auto',no_invali