开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1588|回复: 1
收起左侧

[其它数据库例题] SQL Server三大算法的I/O成本

[复制链接]

结帖率:61% (35/57)
发表于 2013-4-15 14:12:39 | 显示全部楼层 |阅读模式   海南省乐东黎族自治县
1. Nested Loop Join(嵌套循环联结)  算法:
  其思路相当的简单和直接:对于关系R的每个元组 r 将其与关系S的每个元组 s 在JOIN条件的字段上直接比较并筛选出符合条件的元组。写成伪代码就是:
  代价:
  被联结的表所处内层或外层的顺序对磁盘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开销。
  2. Sort-Merge Join (排序合并联结)
  Nested Loop一般在两个集合都很大的情况下效率就相当差了,而Sort-Merge在这种情况下就比它要高效不少,尤其是当两个集合的JOIN字段上都有聚集索引(clustered index)存在时,Sort-Merge性能将达到最好。
  算法:
  基本思路也很简单(复习一下数据结构中的合并排序吧),主要有两个步骤:
  a.按JOIN字段进行排序
  b.对两组已排序集合进行合并排序,从来源端各自取得数据列后加以比较(需要根据是否在JOIN字段有重复值做特殊的“分区”处理)
  代价:(主要是I/O开销)
  有两个因素左右Sort-Merge的开销:JOIN字段是否已排序 以及 JOIN字段上的重复值有多少。
  ◆最好情况下(两列都已排序且至少有一列没有重复值):O (n + m) 只需要对两个集合各扫描一遍。(这里的m,n如果都能用到索引那就更好了)
  ◆最差情况下(两列都未排序且两列上的所有值都相同):O (n * log n + m * log m + n * m) 两次排序以及一次全部元组间的笛卡尔乘积
  3. Hash Join (哈希联结)
  Hash Join在本质上类似于两列都有重复值时的Sort-Merge的处理思想——分区(patitioning)。但它们也有区别:Hash Join通过哈希来分区(每一个桶就是一个分区)而Sort-Merge通过排序来分区(每一个重复值就是一个分区)。
  值得注意的是,Hash Join与上述两种算法之间的较大区别同时也是一个较大限制是它只能应用于等值联结(equality join),这主要是由于哈希函数及其桶的确定性及无序性所导致的。
  算法:
  基本的Hash Join算法由以下两步组成:
  同nested loop,在执行计划中build input位于上方,probe input位于下方。
  hash join操作分两个阶段完成:build(构造)阶段和probe(探测)阶段。
  a.Build Input Phase: 基于JOIN字段,使用哈希函数h2为较小的S集合构建内存中(in-memory)的哈希表,相同键值的以linked list组成一个桶(bucket)
  b.Probe Input Phase: 在较大的R集合上对哈希表进行核对以完成联结。
  代价:
  值得注意的是对于大集合R的每个元组 r ,hash bucket中对应 r 的那个bucket中的每个元组都需要与 r 进行比较,这也是算法最耗时的地方所在。
  CPU开销是O (m + n * b) b是每个bucket的平均元组数量。
  总结:
  三种join方法,都是拥有两个输入,优化的基本原则:
  1.避免大数据的hash join,(hash join适合低并发情况,他占用内存和io是很大的);
  2.尽量将其转化为高效的merge join、nested loop join。可能使用的手段有表结构设计、索引调整设计、SQL优化,以及业务设计优化。

结帖率:37% (7/19)
发表于 2013-4-23 10:02:00 | 显示全部楼层   北京市北京市
I/O?什么东西
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表