第07课:子查询提升

子查询和子连接不同,它不是“表达式”,它是“表”。因此,优化器把子查询当做表来对待,从而针对子查询产生的是一个扫描路径,也就是 SubQueryScan。

SIMPLE 子查询的提升

如果把子查询看做一个表,我们可以叫它“子查询表”,这个子查询表和其他表在做连接(Join)操作。子查询如果被提升,会转换成子查询中的表直接与与上层的表做连接操作。查询优化模块对表之间的连接操作的优化做了很多工作,因此可能获得更好的执行计划。PostgreSQL 提升了 3 种类型的子查询:SIMPLE 子查询、VALUES 子查询和 UNION 子查询,我们分别来看一下这 3 种子查询的提升。

所谓 SIMPLE 子查询,实际上就是经典的子查询。对于 SIMPLE 子查询,我们先看一下它的提升条件。首先要求子查询的类型是真的“简单”(simple)的。所谓的简单,需要满足如下条件:不能包含聚集操作、窗口函数、GROUP 操作等。在子连接提升的时候我们已经见过类似的条件,下面的例子中子查询中包含了聚集函数 avg,不能提升。

postgres=# EXPLAIN SELECT * FROM TEST_A, (SELECT avg(a) FROM TEST_B) b;
                             QUERY PLAN
--------------------------------------------------------------------
 Nested Loop  (cost=2.25..5.27 rows=100 width=48)
   ->  Aggregate  (cost=2.25..2.26 rows=1 width=32)
         ->  Seq Scan on test_b 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值