Oracle执行计划中的Join方式

此处的join方式指的不是内连接外连接之类的,指的是oracle在运行的时候的链接方式。包含以下几种:

Nested Loop

Hash Join

Sort Merge Join

Cartesian Join

Nested Loop

从驱动表返回所有符合条件的记录,然后用这每条记录去循环查找内表(inner table)。当内表条数不多时,这个循环操作的效率不低,但是如果内表条数很多且没有索引,那么效率会奇差。数据库调优甚至会因为在loop相对小的表的时候花费了特别多的时间,可能会强制加hint来避免nested loop这种循环查找的连接方式。最好操作是驱动表需要查找的记录数小,内表数据量小于1w条而非相对驱动表而言小,查找的列加上有效索引。

2.Hash join

两个需要连接的表中较小的那个在内存中构建hash表。将大表的查询列进行hash计算后在内存的hash表上查找出对应的列。在两个表的数据量没有明显的差距时,优化器一般会选择这种方式。不过这种方式需要占用内存,如果hash表过大,可能会分割造成大量的I/O读取。

3.Sort Merge Join

两个表都通过连接列进行排序,但是并非同时进行。排序完成后进行merge匹配操作来返回结果集。一般来说,hash join比merge join少了排序这道操作,性能相对更高。但是对于已经排序的数据,merge join明星性能更好。

4.Cartesian Join

这是一种会产生笛卡尔积数量结果集的连接方式。一个表的所有列连接另一张表的所有列,在我短暂的职业生涯中,还没有碰到过有需要出动这种连接方式的需求。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181009G1EGXY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券