首页 > 开发 > 综合 > 正文

关于三种JOIN的理解

2024-07-21 02:33:17
字体:
来源:转载
供稿:网友

  Nested loop join:
  
  步骤:确定一个驱动表(outer table),另一个表为inner table,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)。 需要注重的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。
  
  cost = outer access cost + (inner access cost * outer cardinality)
  
    2   NESTED LOOPS                  3   141    7 (15)
    3   TABLE ACCESS FULL      EMPLOYEES     3   60    4 (25)
    4   TABLE ACCESS BY INDEX ROWID JOBS       19   513    2 (50)
    5    INDEX UNIQUE SCAN     JOB_ID_PK     1           
  
  EMPLOYEES为outer table, JOBS为inner table.
  
  Hash join
  
  步骤:将两个表中较小的一个在内存中构造一个HASH表(对JOIN KEY),扫描另一个表,同样对JOIN KEY进行HASH后探测是否可以JOIN。适用于记录集比较大的情况。需要注重的是:假如HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个写的代价,会降低效率。
  
  cost = (outer access cost * # of hash partitions) + inner access cost
  --------------------------------------------------------------------------
   Id  Operation       Name     Rows  Bytes Cost (%CPU)
  --------------------------------------------------------------------------
    0 SELECT STATEMENT            665 13300    8 (25)
    1  HASH JOIN               665 13300    8 (25)
    2   TABLE ACCESS FULL  ORDERS      105   840    4 (25)
    3   TABLE ACCESS FULL  ORDER_ITEMS   665  7980    4 (25)
  --------------------------------------------------------------------------
  
  ORDERS为HASH TABLE,ORDER_ITEMS扫描
  
  Sort merge join
  
  步骤:将两个表排序,然后将两个表合并。通常情况下,只有在以下情况发生时,才会使用此种JOIN方式:
  
  1.RBO模式
  
  2.不等价关联(>,<,>=,<=,<>)
  
  3.HASH_JOIN_ENABLED=false
  
  4.数据源已排序
  
  cost = (outer access cost * # of hash partitions) + inner access cost

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表