rule 下所谓驱动表
还有 nested loops and hash join 之份我们以 nested loop 为例:
如果两个表连接字段都没有索引(通常这个时候是 sort merge / hash join),则驱动表会选择后者
若两个表其中有一个有索引而另外一个没有索引,则驱动表是没有索引那一个,跟顺序无关
若两个表都有索引,则驱动表为 后面 那一个表
所以事实上,RULE下,只有在两个表都存在连接字段的索引的情况下才需要考虑顺序问题
也就是小表放在后面大表放在前面(当然到底哪个好这实际上还跟 符合条件的记录数、数据分布等因素相关!!!,所以应该以实际测试为准)
如果是 CBO 下则跟顺序无关
关键的
是明白执行计划而不在于记什么规则
举例,表连接返回一条记录
存在两个表,一个 10条记录 ,一个1000万条记录
若2表都存在连接字段索引,若以小表为驱动表,则
代价:
10* (通过索引在大表查询一条记录的代价)
若以大表为驱动表:
1000万 * (通过索引在小表中查询一条记录的代价)
通过索引获取一条记录,10rows的表,代价通常在 3 blocks
索引2块,表一块
而如果是1000万的表,索引可能达到4块表一块
这样一来参考上面的计算,你说哪个更好?很显然!
FROM: http://www.itpub.net/thread-144375-2-1.html
本文探讨了在不同情况下如何选择合适的表作为驱动表进行SQL连接操作,以实现查询优化。介绍了在RULE模式下,如何根据索引的存在与否决定驱动表的选择,并通过具体的例子展示了小表与大表作为驱动表的成本差异。
8万+

被折叠的 条评论
为什么被折叠?



