数据库的三种join

 

 

首先明确下几个概念,因为这几个概念我也一直没有搞清楚。

驱动表:是在使用多表嵌套连接时,会先全表扫描该驱动表,然后驱动表返回的结果集中一行一行去匹配被驱动表(可以利用索引),所以我们会选择小表做为驱动表,而被驱动使用索引进行连接。

驱动表(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的性能开销   几乎都在前两步。

 

猜你喜欢

转载自labreeze.iteye.com/blog/2171794