eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« Oracle ACE更新 发布中国ACE信息 | Blog首页 | 2007我的新书写作计划及进度 »

Oracle Peeking绑定变量的控制
modb.pro

我们知道从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-


历史上的今天...
    >> 2012-03-07文章:
    >> 2011-03-07文章:
    >> 2010-03-07文章:
    >> 2009-03-07文章:
    >> 2008-03-07文章:
    >> 2005-03-07文章:
           十年

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可以带入变量。


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com