了解散列连接的工作原理
Understanding how a hash join works
我对此查询有以下执行计划:
EXPLAIN SELECT * FROM houses INNER JOIN users ON houses.creator_id = users.id;
Hash Join (cost=16.52..20.79 rows=100 width=600)
Hash Cond: (houses.creator_id = users.id)
-> Seq Scan on houses (cost=0.00..4.00 rows=100 width=348)
-> Hash (cost=12.90..12.90 rows=290 width=252)
-> Seq Scan on users (cost=0.00..12.90 rows=290 width=252)
如果我正确理解散列连接算法,它所做的是将正确的关系 (users
) 放入散列 table,然后在左侧关系 (houses
) 使用快速访问散列 table.
但是,我不知道这个和那个 EXPLAIN
是如何匹配的。为什么要对 houses
进行顺序扫描?我知道 users
的顺序扫描是将所有数据转储到哈希中,但为什么在 houses
上进行顺序扫描?
你的第二步有点错误:
首先扫描内部关系并对连接条件进行散列处理。这样就构建了一个hash结构
其次,外部关系被扫描并且哈希table被探测匹配找到每一行。
如果第二步是相反的方式,您将有一个嵌套循环连接和一个不必要的散列步骤。
我对此查询有以下执行计划:
EXPLAIN SELECT * FROM houses INNER JOIN users ON houses.creator_id = users.id;
Hash Join (cost=16.52..20.79 rows=100 width=600)
Hash Cond: (houses.creator_id = users.id)
-> Seq Scan on houses (cost=0.00..4.00 rows=100 width=348)
-> Hash (cost=12.90..12.90 rows=290 width=252)
-> Seq Scan on users (cost=0.00..12.90 rows=290 width=252)
如果我正确理解散列连接算法,它所做的是将正确的关系 (users
) 放入散列 table,然后在左侧关系 (houses
) 使用快速访问散列 table.
但是,我不知道这个和那个 EXPLAIN
是如何匹配的。为什么要对 houses
进行顺序扫描?我知道 users
的顺序扫描是将所有数据转储到哈希中,但为什么在 houses
上进行顺序扫描?
你的第二步有点错误:
首先扫描内部关系并对连接条件进行散列处理。这样就构建了一个hash结构
其次,外部关系被扫描并且哈希table被探测匹配找到每一行。
如果第二步是相反的方式,您将有一个嵌套循环连接和一个不必要的散列步骤。