[sql parse的疑惑]关于使用绑定变量后,CBO怎么能准确给出执行计划呢?

[复制链接]
查看11 | 回复9 | 2008-1-2 17:35:53 | 显示全部楼层 |阅读模式
我们在使用绑定变量后,在parse ,bind ,execute,fetch 四个阶段中parse阶段就已经给出了执行计划,但是直到bind,才会知道变量实际的值。 也就是说使用绑定变量后,在parse阶段Oracle是不知道变量实际值是多少的,无法准确估计返回量? 这样给出的执行计划是否准确?
这样的话,即使使用了CBO,一个返回量大的查询和一个返回量小的查询所使用的执行计划不都一样了吗?
但是实际中CBO还是会根据情况选择全表扫描或者是用索引的,不知道Oracle是怎么做的?
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
在 oracle 920 的版本开始
在sql第一次解析的时候,oracle会去窥视bind value以决定执行计划,直到该sql失效之前,以后能利用该sql的session将使用第一次解析所产生的执行计划,这样第一次bind的value将很关键。这个功能好不好,呵呵,但oracle目前就是这样子的
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
在10g上这个问题也没有解决。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
在10g上这个问题也没有解决。
在列值分布不均的情况下,用bind variable不好,可以考虑不用bind variable
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
呵呵,谢谢两位版主的精彩解答。
"在sql第一次解析的时候,oracle会去窥视bind value以决定执行计划,直到该sql失效之前,以后能利用该sql的session将使用第一次解析所产生的执行计划"
所以说对那些列值锯齿状分布的和那些查询条件范围变化很大的SQL,就很容易产生错误的执行计划了。。。
"在10g上这个问题也没有解决。
在列值分布不均的情况下,用bind variable不好,可以考虑不用bind variable"

嗯,是啊,我也碰到过这种情况了。
真的没有办法了吗? 看来只有在减少硬分析和让CBO更准确之间做选择了。。。。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
和和,这个是个取舍的问题了,如果是需要精确的最忧执行,且执行次数不多,
就用literal把,如果多次执行,这时候,parse的成本就比较高了,最好通过bind来做了
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
经常遇到cbo因此这个原因导致选择不好的执行计划啊。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
顶顶老坟,最近也遇到这个问题,在10gR2下使用绑定变量感觉性能比原来还差.
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
如果这样的话问题很难解决
绑定变量和准切的执行计划就是很难统一的了
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
OLTP中节省解析时间是重要的,因为一般的语句运行也就几个ms到几十ms,所以bind.
在分析查询中,较多的语句执行需要几秒甚至几分钟,所以解析时间
不重要,主要是执行时间.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行