2010-04-09 34 views
1

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

如果我想连接COL1与COL2,并且COL1较小,它会在COL1中进行全面扫描,然后使用sabe哈希函数在COL2中进行完整扫描。

这是正确的吗?

回答

1

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

散列连接算法的生成的更小的 其两个输入一个 内存中的哈希表,然后读取 较大的输入并探查在-memory 散列表查找匹配项,其中 写入工作表。如果 较小的输入不适合 内存,哈希联接操作 将这两个输入分为较小的 工作表。递归处理这些较小的工作表 ,直到 较小的输入适合内存。

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

+0

你能澄清一件事吗?我读过,在巨大的表格上使用散列连接。假设BigTable包含100m记录,LittleTable只包含100条记录。会使用散列连接吗?如果它会:不会对所有100m记录进行全面迭代,以查看该列是否出现在哈希表中与常规索引查找相比是浪费资源?或者我错过了什么? – 2014-09-21 20:34:38

+0

@mrhobo,只需询问我们自己的问题,包括所有关于您的数据和查询的详细信息。你会得到比我可以输入评论更好的答案 – 2014-09-22 13:00:32