PostgreSQL - 索引的存在导致hash-join

时间:2018-01-12 07:09:12

标签: postgresql join sql-execution-plan

我正在查看两个简单表的自然连接查询的EXPLAIN。首先,postgresql规划器正在使用merge-join。然后,我在连接的属性上添加索引,它会导致规划器使用散列连接(并且顺序读取数据!)。
所以我的问题是:为什么索引的存在会导致散列连接?

其他数据&代码:

  • 我定义了两个关系:R(A,B)和S(B,C)。 (没有主键或 这样)。
  • 用几行数据填充表格(每个约5个,这样R和S中的属性B有共同的值)。
  • 然后执行:
EXPLAIN VERBOSE SELECT * FROM R NATURAL JOIN S;

结果

Merge Join  (cost=317.01..711.38 rows=25538 width=12)... 

最后执行:

CREATE INDEX SI on S(B);
EXPLAIN VERBOSE SELECT * FROM R NATURAL JOIN S;

结果

Hash Join  (cost=1.09..42.62 rows=45 width=12)...       
    Seq Scan on "user".s  (cost=0.00..1.04 rows=4 width=8)

0 个答案:

没有答案