【问题标题】:Hash Join require Full Table ScanHash Join 需要全表扫描
【发布时间】:2010-04-09 02:20:15
【问题描述】:

那么,我想知道是否需要在两个表之间进行哈希联接才能对列进行全表扫描?

如果我想加入 COL1 和 COL2,并且 COL1 更小,它会在 COL1 中进行全扫描,创建一个 Hashmap,然后使用 sabe 哈希函数在 COL2 中进行全扫描。

这是正确的吗?

【问题讨论】:

    标签: database join


    【解决方案1】:

    每个数据库都可以有它自己的 aHash Join 的实际实现。但是我想说可能的方法类似于this

    Hash Join 算法构建了一个 较小的内存哈希表 它的两个输入,然后读取 更大的输入并探测内存 哈希表来查找匹配项,它们是 写入工作表。如果 较小的输入不适合 内存,哈希连接运算符 将两个输入分成更小的 工作台。这些较小的工作台 递归处理,直到 较小的输入适合内存。

    至于提问:is necessary to make a full table scan on the collumns

    我会说不,这还取决于数据库以及它对事物的优化程度。如果查询中有足够的条件来限制任一表中的行,那么它将在使用哈希合并算法之前将这些行拉出。

    当它构建in-memory hash table of the smaller of its two inputs 时,它会使用最好的方法将这些行从表中拉出,这不一定是表扫描。如果您在查询中没有条件来减少该表上的行数,那么它将进行表扫描。

    then reads the larger input and probes the in-memory hash table to find matches 时,它也会使用最好的方法拉出这些行,这不一定是表扫描。

    如果您的查询是:

    SELECT
        *
        FROM BigTable
            INNER JOIN LittleTable ON BigTable.Col=LittleTable.Col
    

    如果使用了散列连接,它很可能会通过执行表扫描从 LittleTable 在内存中创建一个散列表,然后对这些散列键进行表扫描 BigTable 检查。

    如果您的查询是:

    SELECT
        *
        FROM BigTable
            INNER JOIN LittleTable ON BigTable.Col=LittleTable.Col
        WHERE LittleTable.Col2 >'2010/01/01' AND LittleTable.Col2<'2010/01/31'
    

    如果使用哈希连接,它很可能会从 LittleTable 在内存中创建一个哈希表,但不使用表扫描(如果有要使用的索引),然后对这些哈希键进行表扫描 BigTable 检查。添加更多过滤器以更改删除 BigTable 上的表扫描。

    【讨论】:

    • 你能澄清一件事吗?我读过在大表上使用散列连接。假设 BigTable 包含 100m 条记录,而 LittleTable 仅包含 100 条记录。会使用哈希联接吗?如果它会:与常规索引查找相比,对所有 100m 记录进行完整迭代以查看该列是否出现在哈希表中不是浪费吗?还是我错过了什么?
    • @mrhobo,只需问我们自己的问题,包括特定于您的数据和查询的所有详细信息。你会得到比我输入评论更好的答案
    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多