优化器如何确定合并联接和哈希联接之间的关系?

时间:2018-06-22 11:54:23

标签: postgresql join relational-database query-optimization

数据库系统概念介绍了几种实现联接操作的方法。其中两个是合并联接和哈希联接。

  1. 我想知道优化器何时决定使用合并联接并 什么时候加入哈希?
  2. 尤其是来自https://stackoverflow.com/a/1114288/156458

      

    哈希联接只能用于等联接,但是合并联接更灵活。

    但是数据库系统概念说,两者都仅用于等值连接和     自然连接。

      

    合并联接算法(也称为排序合并联接算法)   可用于计算自然联接和等联接。

         

    ...

         

    像merge-join算法一样,hash-join算法可用于   实施自然联接和等联接。

谢谢。


我的问题来自PostgreSQL文档,其中有两个示例,我不确定为什么一个使用合并联接,而另一个使用哈希联接:

EXPLAIN SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
                                        QUERY PLAN
------------------------------------------------------------------------------------------
 Hash Join  (cost=230.47..713.98 rows=101 width=488)
   Hash Cond: (t2.unique2 = t1.unique2)
   ->  Seq Scan on tenk2 t2  (cost=0.00..445.00 rows=10000 width=244)
   ->  Hash  (cost=229.20..229.20 rows=101 width=244)
         ->  Bitmap Heap Scan on tenk1 t1  (cost=5.07..229.20 rows=101 width=244)
               Recheck Cond: (unique1 < 100)
               ->  Bitmap Index Scan on tenk1_unique1 
 (cost=0.00..5.04 rows=101 width=0)
                     Index Cond: (unique1 < 100)

EXPLAIN SELECT *
FROM tenk1 t1, onek t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;
                                        QUERY PLAN
------------------------------------------------------------------------------------------
 Merge Join  (cost=198.11..268.19 rows=10 width=488)
   Merge Cond: (t1.unique2 = t2.unique2)
   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)
         Filter: (unique1 < 100)
   ->  Sort  (cost=197.83..200.33 rows=1000 width=244)
         Sort Key: t2.unique2
         ->  Seq Scan on onek t2  (cost=0.00..148.00 rows=1000 width=244)

0 个答案:

没有答案