等值表关联时需要注意的问题

声明:文中观点为作者的个人观点、不代表官方、如需更多帮助,请联系Pivotal官方·转载必须注明出处

本文只讨论2个表的关联情况,更多数量表之间的关联也是一个一个关联的,可以类推
在成熟的数据库中,关联算法一般包括:Hash Join、Nestloop Join、Merge Join
第一种在多数情况下是最高效的算法,该算法将一个表Hash到内存中,然后一边扫描另一个表一遍通过Hash值匹配
    Hash匹配,依赖的是内存寻址,寻址效率高,Hash关联时,将一张表Hash到内存中之后,
    边扫描另外一张表,边通过Hash值匹配,性能是线性可控的
    假设表T1和T2的数据量分别为n1和n2,则该关联的计算复杂度可以简单记为n1+n2。
    Nestloop关联走的是循环算法,计算复杂度可以简单记为n1*n2,通常n1*n2远远大于n1+n2。
    Merge关联需要先排序再关联,计算复杂度可以简单记为(n1)ln(n1)+(n2)ln(n2),通常远大于>n1+n2,但远小于n1*n2。
    所以从计算复杂度上来说Nestloop>Merge>Hash
同样是Hash连接,还存在Hash哪个表的问题,因为被Hash的数据需要全部放入内存,内存容量是有限的,所以,最理想的情况
    就是把尺寸较小的表放入内存。本文重点讨论的就是这一类情况。
   不管你的业务希望如何关联两张表,请确保被Hash到内存中的是小表,实在不满足,请修改算法逻辑以确保被Hash的是小表。
一、大表 left join 小表,只要能确保GP数据库的统计信息能正确识别大表与小表即可。
二、大表 inner join 小表,只要能确保GP数据库的统计信息能正确识别大表与小表即可。
    -----------------以上2种情况如果不能正确的选择将小表Hash到内存中,请确保统计信息没有问题。
三、小表 left join 大表,一般来说,数据库无法选择将小表hash,因为将小表hash后用大表匹配无法确保小表中的记录全部
   都会被匹配,而数据库又没有智能到再去扫描一遍小表。因此,设计sql的人应该明白,应该将该场景转化为
   小表 left join (小表 inner join 大表),这样改写SQL使得子查询中是将小表Hash到内存中,少量的关联结果
   再次与小表关联,第二次关联的量很小,符合原则
四、小表关联大表最XXX(比如最新记录,可能需要用到window函数来获取)结果的情况,请参考上述情况,先关联出中间结果,
   再做最XXX处理,然后再与小表关联一次,性能同样会有显著提升
五、大表关联大表,本文暂不讨论。

综上、等值表关联时要确保:
    被Hash到内存中的是小表,而绝非大表


声明:文中观点为作者的个人观点、不代表官方、如需更多帮助,请联系Pivotal官方·转载必须注明出处

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11022757/viewspace-1400523/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11022757/viewspace-1400523/

你可能感兴趣的:(等值表关联时需要注意的问题)