浅谈查询优化器中的JOIN算法
2008-04-02 10:38:07来源:互联网 阅读 ()
【IT专家网独家】查询优化器都是支持JOIN操作的,而SQL Server 中主要有以下三类JOIN算法:Nested Loop、Sort-Merge连同Hash Join。尽管每种算法都并不是很复杂,但考虑到性能优化,在产品级的优化器实现时往往使用的是改进过的变种算法。譬如SQL Server 支持block nested loops、index nexted loops、sort-merge、hash join连同hash team。我们在这里只对上述三种基本算法的原型做一个简单的介绍。
【假设】有两张表R和S,R共占有M页,S共占有N页。r 和 s 分别代表元组,而 i 和 j 分别代表第i或第 j 个字段,也就是后文提到的JOIN字段。
1. Nested Loop Join(嵌套循环联结)
算法:
其思路相当的简单和直接:对于关系R的每个元组 r 将其和关系S的每个元组 s 在JOIN条件的字段上直接比较并筛选出符合条件的元组。写成伪代码就是:
foreach tuple r Î R do foreach tuple s Î S do if ri == sj then add to result |
代价:
被联结的表所处内层或外层的顺序对磁盘I/O开销有着很重要的影响。而CPU开销相对来说影响较小,主要是元组读入内存以后(in-memory)的开销,是 O (n * m)
对于I/O开销,根据 page-at-a-time 的前提条件,I/O cost = M M * N,翻译一下就是 I/O的开销 = 读取M页的I/O开销 M次读取N页的I/O开销。
使用小结:
• 适用于一个集合大而另一个集合小的情况(将小集合做为外循环),I/O性能不错。
• 当外循环输入相当小而内循环很大且有索引建立在JOIN字段上时,I/O性能相当不错。
• 当两个集合中只有一个在JOIN字段上建立索引时,一定要将该集合作为内循环。
• 对于一对一的匹配关系(两个具备唯一约束字段的联结),能够在找到匹配元组后跳过该次内循环的剩余部分(类似于编程语言循环语句中的continue)。
2. Sort-Merge Join (排序合并联结)
Nested Loop一般在两个集合都很大的情况下效率就相当差了,而Sort-Merge在这种情况下就比他要高效不少,尤其是当两个集合的JOIN字段上都有聚集索引(clustered index)存在时,Sort-Merge性能将达到最好。
算法:
基本思路也很简单(复习一下数据结构中的合并排序吧),主要有两个步骤:
(1) 按JOIN字段进行排序
(2) 对两组已排序集合进行合并排序,从来源端各自取得数据列后加以比较(需要根据是否在JOIN字段有重复值做特别的“分区”处理)
代价:(主要是I/O开销)
有两个因素左右Sort-Merge的开销:JOIN字段是否已排序 连同 JOIN字段上的重复值有多少。
• 最好情况下(两列都已排序且至少有一列没有重复值):O (n m) 只需要对两个集合各扫描一遍
• 最差情况下(两列都未排序且两列上的任何值都相同):O (n * log n m * log m n * m) 两次排序连同一次全部元组间的笛卡尔乘积
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 解析SQL Server中行转列问题
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash