散列连接需要全表扫描

时间:2010-04-09 02:20:15

标签: database join

所以,我想知道是否需要在两个表之间进行散列连接才能在列上进行全表扫描?

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

这是对的吗?

1 个答案:

答案 0 :(得分:2)

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

  

哈希联接算法构建一个   内存中的哈希表的较小者   它的两个输入,然后读取   更大的输入和探测内存   用于查找匹配的哈希表   写到工作台上。如果   较小的输入不适合   内存,散列连接运算符   将两个输入分成更小的   工作台。这些较小的工作台   递归处理,直到   较小的输入适合记忆。

至于问题: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上删除表扫描。