Oracle Peeking绑定变量的控制
我们知道从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可以带入变量。