绑定变量让sql重新硬解析的方法及11g自适应游标

本文探讨了如何通过DDL或dbms_shared_pool.purge来解决因绑定变量窥探导致的SQL执行计划问题。在11g中,自适应游标通过运行时统计信息判断输入值对执行计划的影响,分为bind sensitive和bind aware两种状态,介绍了这两种状态的触发条件和实验案例。
摘要由CSDN通过智能技术生成

在系统中有的时候,因为邦迪变量窥探的影响导致了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值