文档首页 > > 开发指南> 优化查询性能> 改进查询> 典型SQL调优点> 子查询调优

子查询调优

分享
更新时间: 2019/06/24 GMT+08:00

子查询介绍

一个“SELECT...FROM...WHERE...”语句称为一个查询块,将一个查询块嵌套到另一个查询的FROM子句,WHERE子句,HAVING等子句中的查询称为嵌套查询。其中被嵌入其它查询块中的查询称为嵌套子查询,简称子查询

子查询可以分为相关性子查询和非相关性子查询。相关性子查询是指该子查询的执行依赖于外层父查询的某些属性值,它依赖于父查询传给它的参数,当参数改变时,需要重新执行一遍子查询得到新的结果。非相关子查询是完全的独立的,它只需要执行一次即可。

优化示例

从上面对子查询的介绍可以看出,非相关子查询不会影响性能,因为它只需要执行一次即可。而相关子查询是需要迭代的执行多次,对性能有很大的影响。下面介绍两个常见示例:

示例1:修改基表为replicate表,并且在过滤列上创建索引。

create table master_table (a int);
create table sub_table(a int, b int);
select a from master_table group by a having a in (select a from sub_table); 

上述事例中存在一个相关性子查询,为了提升查询的性能,可以将sub_table修改为一个relication表,并且在字段a上创建一个index。

示例2:修改select语句,将子查询修改为和主表的join,或者修改为可以提升的subquery,但是在修改前后需要保证语义的正确性。

explain (costs off)select * from master_table as t1 where t1.a in (select t2.a from sub_table as t2 where t1.a = t2.b);
                        QUERY PLAN
----------------------------------------------------------
 Streaming (type: GATHER)
   Node/s: All datanodes
   ->  Seq Scan on master_table t1
         Filter: (SubPlan 1)
         SubPlan 1
           ->  Result
                 Filter: (t1.a = t2.b)
                 ->  Materialize
                       ->  Streaming(type: BROADCAST)
                             Spawn on: All datanodes
                             ->  Seq Scan on sub_table t2
(11 rows)

上面事例计划中存在一个subPlan,为了消除这个subPlan可以修改语句为:

explain(costs off) select * from master_table as t1 where exists (select t2.a from sub_table as t2 where t1.a = t2.b and t1.a = t2.a);
                    QUERY PLAN
--------------------------------------------------
 Streaming (type: GATHER)
   Node/s: All datanodes
   ->  Hash Semi Join
         Hash Cond: (t1.a = t2.b)
         ->  Seq Scan on master_table t1
         ->  Hash
               ->  Streaming(type: REDISTRIBUTE)
                     Spawn on: All datanodes
                     ->  Seq Scan on sub_table t2
(9 rows)

从计划可以看出,subPlan消除了,计划变成了两个表的semi join,这样会大大提高执行效率。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区