zoukankan      html  css  js  c++  java
  • sql 查询强制使用HASH连接性能测试比较

    HASH JOIN 散列连接
    hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
    当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高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,两个巨大的表之间的连接。
    2,在一个巨大的表和一个小表之间的连接。
    3,可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join

    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结果sql <wbr>查询强制使用HASH连接性能测试比较
    hash查询: time结果
    sql <wbr>查询强制使用HASH连接性能测试比较
    -----------------------------------------------------------------------------------------------------------------------
    NOT hash查询: IO结果
    sql <wbr>查询强制使用HASH连接性能测试比较
    NOT hash查询: time结果
    sql <wbr>查询强制使用HASH连接性能测试比较
  • 相关阅读:
    C# 编码解码
    asp.net跨域问题
    C# crc16modbus
    c# 日志生成
    C# 对newtonsoft.json对象进行ascii排序
    C# 字节转结构体、结构体转字节
    按ascill排序参数
    C# Rsa加密(私钥加密、公钥解密、密钥格式转换、支持超大长度分段加密)
    Interview
    Leetcode
  • 原文地址:https://www.cnblogs.com/zxtceq/p/5691213.html
Copyright © 2011-2022 走看看