openGauss包含agg、distinct的子查询等条件谓词不下推场景性能问题优化
·
概述
在openGauss中带有agg,distinct的子查询,优化器默认没有让条件谓词不下推,当子查询的结果集很大时,通常会存在性能问题,openGauss提供了一种基于规则的优化方案(由rewrite_rule参数控制),人为控制优化器进行改写优化,在实际工作中可以根据具体场景进行选择。
案例演示
1、创建测试表
create table t1(id int,name varchar);
create table t2(id int,name varchar);
--插入测试数据
insert into t1 values(generate_series(1,1000000),'aa');
insert into t2 values(generate_series(1,100000),'bb');
create index on t1(id);
create index on t2(id);
2、模拟业务SQL如下:
select
t1.id,
t1.name,
tt.cn
from t1
left join
(select id,sum(name) as cn from t2 group by id) tt
on t1.id=tt.id
where t1.id<10;
sql执行计划如下,从执行计划中可以看出子查询t2表查询条件没有下推,全表100万数据做agg之后在跟t1表关联查询,最终只返回18行数据。如果t2的谓词条件可以下推,提前做数据过滤减少结果集,性能会有明显提升。
{{{height=“auto”}}}
vastbase优化器提供谓词条件下推的重写规则:
- 有序列表predpush:在predpushnormal和predpushforce中根据代价选择最优计划。
- 有序列表predpushnormal:使用Predicate Push查询重写规则(下推谓词条件到子查询中)。
- predpushforce:使用Predicate Push查询重写规则(下推谓词条件到子查询中,尽可能的利用索引加速)。
参数可以全局设置,也可以会话级设置,同时支持通过hint方式对单个SQL生效。
使用方式如下:
select /*+ set (rewrite_rule 'magicset,predpush')*/
t1.id,
name,
tt.cn
from t1
left join
(select id,sum(name) as cn from t2 group by id) tt
on t1.id=tt.id
where t1.id<10;
SQL执行计划如下,从执行计划可以看出谓词条件下推到子查询中后,t2表扫描的数据从原来的全表扫描(110000行),转变为indexscan(扫描行数 36行),执行时间由202ms,提升到0.4ms。
{{{height=“auto”}}}
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)