【发布时间】:2010-04-09 02:20:15
【问题描述】:
那么,我想知道是否需要在两个表之间进行哈希联接才能对列进行全表扫描?
如果我想加入 COL1 和 COL2,并且 COL1 更小,它会在 COL1 中进行全扫描,创建一个 Hashmap,然后使用 sabe 哈希函数在 COL2 中进行全扫描。
这是正确的吗?
【问题讨论】:
那么,我想知道是否需要在两个表之间进行哈希联接才能对列进行全表扫描?
如果我想加入 COL1 和 COL2,并且 COL1 更小,它会在 COL1 中进行全扫描,创建一个 Hashmap,然后使用 sabe 哈希函数在 COL2 中进行全扫描。
这是正确的吗?
【问题讨论】:
每个数据库都可以有它自己的 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 上的表扫描。
【讨论】: