设为首页 收藏本站
查看: 887|回复: 0

[经验分享] 读《DB2数据库性能调整和优化》札记--join的几种方式

[复制链接]

尚未签到

发表于 2016-11-17 08:22:34 | 显示全部楼层 |阅读模式
  以下是部分引用《DB2数据库性能调整和优化》,对于oracle也是这三种方式,这三种方式出现在执行计划中,因此十分有必要搞清楚内在算法原理。
  对于多表的join一般是采取先join2张表,然后在join下一张表。
  1、NestLoops
  相当于2个循环,通常是在有索引时进行。
在嵌套循环连接中,将扫描第一个(或外部)表,以查找满足查询规则的行。对于在外部表中找到的每一行,数据库服务器将在第二个(或内部)表中搜索其相应的行。是通过索引扫描还是通过表扫描来访问外部表则取决于该表。如果有过滤条件,数据库服务器首先会应用它们。(也就是说where或者on条件和join方式谁先执行不一定,如果是where后执行那么执行filter操作,如果先where那么是带条件的结果集去join)如果内部表没有索引,那么数据库服务器就会将在表上构建索引的成本与连续扫描的成本进行比较(也就是索引不见得是成本低),然后选择成本最低的那一种方法。总成本取决于连接列上是否有索引。如果连接列上有一个索引,那么其成本会相当低;否则,数据库服务器就必须对所有表(外部和内部表)执行表扫描。
  2、MergeJoin
  2个表都将相同的项进行分组,然后比对,扫描将跳跃进行,虽然相同项不必扫描2次了但是因为有排序所以成本很高
   
当连接表的连接列上没有可用索引时,通常使用该连接方法。连接开始之前,如果有过滤条件,那么数据库服务器首先会应用它们,然后对连接列上每个表中的行进行分类。一旦实现了对行的分类,连接两个表的算法就十分容易:数据库服务器仅仅连续地读取两个已分类表,并合并所有相匹配的行。因为该方法在进行表连接之前,必须将所有的连接表分类,所以其成本通常极其高。
 
下面是我结合其他资料,所理解的MergeJoin的过程,请大家批评指正,仿照了《HTML渲染过程》博客的风格,呵呵。具体标题忘了, DSC0000.gif
 
 
DSC0001.jpg
 
 
      先对2表分别进行排序(正序),然后分别取出2表中的一个,两者比较,淘汰其中小的(因为是正序,小的不可能有匹配项),然后以大的为标准继续向下搜索,所以基准项会在两张表轮替。这是示意图。 
  3、HashJoin
  先扫描小表在内存中构建出出hash值,然后对大表进行扫描。
当一个或多个连接表上没有索引时,或者当数据库服务器必须从所有连接表中读取大量行时,就使用这种方法。在该方法中,需要扫描其中的一个表,通常扫描较小的那个表,用它在内存中创建一个哈希表。通过哈希函数,将具有相同哈希值的行放在一个内存中。在扫描完第一个表并将它放在哈希表中之后,就扫描第二个表,并在哈希表中查找该表中的每一行,看是否可以进行连接。如果连接中有更多表,那么数据库服务器将对每个连接表执行相同的操作。
哈希连接包含两个动作:构建哈希(或者是我们所称的构建阶段),以及探测哈希表(或探测阶段)。在构建阶段,数据库服务器读取一个表,并在应用所有现有过滤条件之后,在内存中创建一个哈希表。可以在概念上将哈希表认为是一系列的内存bucket,每个bucket所拥有的地址是通过应用哈希函数从键值导出的。数据库服务器不会在特定的哈希bucket中对键进行分类。在探测阶段,数据库服务器将读取连接中的其他表,如果存在连接谓词,就应用它们。在满足连接谓词限定条件的每个行中,数据库服务器将对键应用哈希函数,并探测哈希表以查找匹配的键值。哈希连接通常比分类合并连接快,因为它没有涉及分类操作。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301397-1-1.html 上篇帖子: DB2数据库、触发器、存储过程、JAVA数据库链接(JDBC)、调用层接口(CLI) 下篇帖子: DB2数据库、DML数据操纵语言、DDL数据定义语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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