计划器的连接策略

本文介绍了数据库查询优化中的连接策略,包括嵌套循环、带有内部索引扫描的嵌套循环、合并连接及哈希连接等方法,并通过示例展示了每种策略的工作原理。

作者:瀚高PG实验室 (Highgo PG Lab)

连接规划

当查找空间很小时,计划器进行一次近似穷举搜索。

当查找空间过大时,计划器使用基因查询优化或者启发法来限制规划时间和内存用量。

连接策略

嵌套循环(Nested loop)

表中每一个记录被取出,产生一个与其他表的每一记录相比较的循环。如果有一次匹配,那么输出记录。

此时成本大体上和表大小的乘积成正比,如果两个表都很大,成本会很高,此策略的效果会很差。

示例

SELECT * FROM foo, bar WHERE foo.x = bar.x

 Nested Loop

   Join Filter: (foo.x = bar.x)

   -> Seq Scan on bar

   -> Materialize

         -> Seq Scan on foo

带有内部索引扫描的嵌套循环(Nested loop with inner index-scan)

示例

SELECT * FROM foo, bar WHERE foo.x = bar.x

Nested Loop

   -> Seq Scan on foo

   -> Index Scan using bar_pkey on bar

         Index Cond: (bar.x = foo.x)

速度相较嵌套索引有所改善,但还不是最佳方案。

合并连接(Merge join)

只处理等值连接。

用排序或索引扫描将两个表中数据排序,然后并行的扫描这两张表,匹配所有相等的值。

示例

SELECT * FROM foo, bar WHERE foo.x = bar.x

 Merge Join

  Merge Cond: (foo.x = bar.x)

  ->  Sort

        Sort Key: foo.x

        ->  Seq Scan on foo

  ->  Materialize

         -> Sort

               Sort Key: bar.x

               ->  Seq Scan on bar

哈希连接(Hash join)

同样只处理等值连接。

内部表中的每一行用散列算法创建一个散列表。然后在外部表中的每一行也被散列化,再扫描一次哈希表来寻找匹配。

哈希连接非常迅速但要求有足够的内存去存储内部元组。

不保证保持输入时候的顺序。

示例

SELECT * FROM foo, bar WHERE foo.x = bar.x

 Hash Join

  Hash Cond: (foo.x = bar.x)

  ->  Seq Scan on foo

  ->  Hash

        ->  Seq Scan on bar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值