绑定变量 oracle 注入,Oracle Peeking绑定变量的控制

Oracle Peeking绑定变量的控制

6ee5639a40442445944d63b514b2dd02.png

我们知道从Oracle9i开始,Oracle引入了Peeking of User-Defined Bind Variables的特性,这个特性可以用来在存在数据倾斜时对执行计划纠偏。

然而这一特性也可能带来一些副作用,所以Oracle同时引入了一个内部参数用于控制这一特性:SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ

2 FROM SYS.x$ksppi x, SYS.x$ksppcv y

3 WHERE x.inst_id = USERENV ('Instance')

4 AND y.inst_id = USERENV ('Instance')

5 AND x.indx = y.indx

6 AND x.ksppinm LIKE '%&par%'

7 /

Enter value for par: peek

old 6: AND x.ksppinm LIKE '%&par%'

new 6: AND x.ksppinm LIKE '%peek%'

NAME VALUE DESCRIB

------------------------------ -------------------- ------------------------------

_optim_peek_user_binds TRUE enable peeking of user binds

这个参数缺省值为True,当设置为False时将禁用peeking of user binds.

-The End-

By eygle on 2007-03-07 15:13 |

Comments (7) |

Internal | 1367 |

7 Comments

个人意见, 在OLAP系统中还是设成False为好. Peeking对了固然好, 但如果Peeking错了, 则麻烦大了.

记得你那篇测试中表明,只有SQL第一次执行时,才会peeking,或者说只要不再需要hard parse,就不再会peeking?

那么这样的peeking作用实在很小,因为如果一个表数据分布确实很不均匀,那么即使柱状图正确,多次SQL的请求结果也会是不相同的,一次peeking选择了正确的执行计划,必然导致后面总会有不如意的执行计划。

大师,如果这个隐含参数设置为false 那么对于绑定变量的SQL 语句来说运行的时候是根据什么来形成执行计划的?

对于数据仓库来说,既然peek 的危害很大,可以不使用绑定变量的

如果设为False,就是少了一个Peeking,因为Peeking对数据分步不均衡的表可能会导致错误的执行计划选择。

如无必要,还是建议不要修改隐含参数。

谢谢大师,我 想问问如果这个参数设置为false 就不peeking了,那么这个 时候oracle的优化器会根据什么来形成执行计划呢 ?

我依照你例子测试了 一下,把这个参数修改成false之后,发现无论id=1还是99,那个查询都走了全表扫描,id有索引,应该index才对 啊

Select * from table1 where id = @id

该语句转换成Oracle时变量@id出现表达式错误,请教高手指点该如何转换,谢谢!

要看你的SQL是写作哪里的,sqlplus中,&id可以带入变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值