此处的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
这是一种会产生笛卡尔积数量结果集的连接方式。一个表的所有列连接另一张表的所有列,在我短暂的职业生涯中,还没有碰到过有需要出动这种连接方式的需求。
领取专属 10元无门槛券
私享最新 技术干货