暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle的排序合并连接(SORT MERGE JOIN)

原创 语菲 2023-05-21
645

排序合并连接主要用于处理两表非等值关联,比如>、>=、<、<=、<>,但是不能用于instr、substr、like、regexp_like关联。instr、substr、like、regexp_like关联只能走嵌套循环。

现有如下SQL:
select * from a,b where a.id=b.id;
A表有10万条数据,B表有100万条数据,A表与B表的ID列都是从1开始每次加1。

假设该SQL走的是嵌套循环,A作为驱动表,B作为被驱动表,那么B表会被扫描10次。大家都知道,嵌套循环被驱动表连接列要包含在索引中,那么B表的ID列需要创建一个索引,嵌套循环会进行传值。当A表通过ID列传值超过10000的时候,B表通过ID列的索引返回数据每次都会超过10000条,这个时候会造成B表大量回表。所以该SQL不能走嵌套循环,只能走排序合并连接。

排序合并连接的算法:两表关联,先对两个表根据连接列进行排序,将较小的表作为驱动表(Oracle官方认为排序合并连接没有驱动表,笔者认为是有的),然后从驱动表中取出连接列的值,到已经排好序的被驱动表中匹配数据,如果匹配上数据,就关联成功。驱动表返回多少行,被驱动表就要被匹配多少次,这个匹配的过程类似嵌套循环,但是嵌套循环是从被驱动表的索引中匹配数据,而排序合并连接是在内存中(PGA中的word area)匹配数据。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论