sql 查询强制使用HASH连接性能测试比较
HASH JOIN 散列连接
hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
(对以上的过程保持疑问,可能是RDMS的问题,在《数据库系统概念》一书中,hash join算法的思想是这样的:对两个关系的连接属性分别作hash,hash函数一定要有较好的随机性和均匀性,如果关系r的一个元组和关系s的一个元组满足连接条件,那么他们在连接属性 上有相同的值。如该值经散列函数映射为i,则关系s的那个元组必在H(ri)中,而关系s的那个元组必在H(si)中。因此,H(ri)中的元组只需与H(si)中的元组作比较,而没有必要与s的其他任何分区作比较。很明显这种算法比以上算法代价小的多。)
至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
hash join可能有优势:
1,两个巨大的表之间的连接。
1,两个巨大的表之间的连接。
2,在一个巨大的表和一个小表之间的连接。
3,可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join
hash查询: time结果
-----------------------------------------------------------------------------------------------------------------------
1.散列连接是CBO做大数据集连接时的常用方式.
2.也可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接
3.Hash join在两个表的数据量差别很大的时候.
4.Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算,将列数据存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash列表中找到相应的值,做匹配。
当缺乏索引或者索引条件模糊时,哈希连接连接比嵌套循环有效。通常比排序合并SORT MERGE JOIN连接快。
在数据仓库环境下,如果表的纪录数多,效率高。
参考地址:http://blog.csdn.net/chengweipeng123/article/details/7235387
以下是自己做的一个小测试
hash查询: IO结果hash查询: time结果
-----------------------------------------------------------------------------------------------------------------------