日期:2014-05-17  浏览次数:20846 次

oracle的CBO优化器主要是根据什么来选择表的连接方式的?
我知道oracle的CBO优化器有三种表的连接方式 ,sort merge join , nested loops , hash join ,但我不知道oracle主要是跟据什么来觉定表的连接方式

比如说有的sql语句表连接是用的sort merge join,但是在网上不是说sort merge join比较慢吗,那为什么还要用sort merge join的方式来连接? 我还看到说用sort merge join连接主要是因为表的索引不够,请问是这样的吗? 小弟先谢过了

------解决方案--------------------
每种计划方式都会根据oracle内部指定的规则计算cost的成本,最后选择cost成本低的。
但是cost的计算并不一定全是正确的,存在出错的可能。所以有时需要我们去干预。

引用楼主 lttzdllf 的帖子:
我知道oracle的CBO优化器有三种表的连接方式 ,sort merge join , nested loops , hash join ,但我不知道oracle主要是跟据什么来觉定表的连接方式

比如说有的sql语句表连接是用的sort merge join,但是在网上不是说sort merge join比较慢吗,那为什么还要用sort merge join的方式来连接? 我还看到说用sort merge join连接主要是因为表的索引不够,请问是这样的吗? 小弟先谢过了

------解决方案--------------------
同LS的。

这个是根据表、索引的统计信息来确定连接方式的。具体的确定过程,以及怎样确定最后选哪种连接方式,最后我也想知道。

要根据具体情况,sort merge join也不一定就最差吧。
“在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(所选的数据超过表记录数的5%)时,排序合并连接将比嵌套循环连更加高效。”

------解决方案--------------------
一般来用NS LOOP的比较多点,HASH对小表会有优势