首先明确下几个概念,因为这几个概念我也一直没有搞清楚。
驱动表:是在使用多表嵌套连接时,会先全表扫描该驱动表,然后驱动表返回的结果集中一行一行去匹配被驱动表(可以利用索引),所以我们会选择小表做为驱动表,而被驱动使用索引进行连接。
驱动表(driving table/outer table)又称为外层表,驱动表仅仅用于nested loops join 和 hash join。
被驱动表也称为内部表。
关于nestedloop
适用场景:大表T_BIG 和小表T_SMALL
小表为驱动表。大表为被驱动表,大表建索引,这样会极大的减少IO的次数。所以形象的位置是小表在外面,大表在内部。
可以参考http://blog.chinaunix.net/uid-20607558-id-1916225.html
关于hashjoin
它里面的分为驱动表和探测表。探测表在内存中会生成一个hash表。
适用场景,外表有返回的记录较多,或者内部表无法用索引筛选出较少的记录。
它的形象位置是大表在外,小表在内。
关于mergejoin
主要适用于非等值连接。
merge join的操作通常分三步:
1、对连接的每个表做table access full;
2、对table access full的结果进行排序。
3、进行merge join对排序结果进行合并。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,merge join会比nested loops性能 更佳。当表特别小或特别巨大的时候,实行全表访问可能会比索引范围扫描更有效。mrege join的性能开销 几乎都在前两步。