请教NestedLoopJoin执行计划问题?内外表都要全表/索引扫描,为什么还要求小表做外表?

[复制链接]
查看11 | 回复2 | 2016-11-29 22:14:05 | 显示全部楼层 |阅读模式
请教NestedLoopJoin执行计划问题?内外表都要全表/索引扫描,为什么还要求小表做外表?或者小表做外表还是做内表是不是效果一样?
因为小表*大表和大表*小表是一样的。



回复

使用道具 举报

千问 | 2016-11-29 22:14:05 | 显示全部楼层
具体操作我也不清楚,
照我的理解,还有个匹配操作次数不一样,借用你的例子:小表作内表,只需要去匹配10次(“去匹配”,类似机械操作里的一个折返/来回动作),而大表作内表,得去匹配9000次,
而这个折返操作,我估计,是个上下文切换操作,是比较耗资源的操作,反而是两数据在对比/匹配时,不怎么消耗资源, 这样,减少“去匹配”这个动作就是优化重点,
这样,以小表为内表,匹配次数最少。
回复

使用道具 举报

千问 | 2016-11-29 22:14:05 | 显示全部楼层
这个执行计划应该是合理的。
因为对NL join来讲,外行源(外表)的数据行数,就是loop数,也就是对内表进行的FTS次数,这个一次也少不了,而内表的FTS,往往都是多块并行读,有时甚至是直接路径读;因此,NL join中,选择数据行数少的做外行源往往效率会更高。就像楼主这种场景,即使大表再大些,一般也会等出结果,如果换成大表作为外行源,可能短期内等不出结果了,只是前者消耗更多的IO资源,后者消耗更多的CPU资源。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行