更新时间:2020-08-17 15:03
下推是查询改写的一项重要优化,它可以利用PolarDB-X的拆分信息来优化执行计划,使得算子尽量下推以达到提前过滤数据、减少网络传输、并行计算等目的。
因此,PolarDB-X的SQL语句优化的基本原则为尽量让更多的计算可下推到RDS MySQL上执行。
可下推计算主要包括:
通过
explain optimizer + sql
可以看到查询改写的具体过程。
下面给出一条SQL的执行计划生成过程的例子。Filter和Project被先后下推到LogicalView算子里面。
Filter和Project下推可以达到提前过滤数据,减少网络传输等效果。
> explain optimizer select c_custkey,c_name from customer where c_custkey = 1;
c_custkey
:customer的拆分键。c_name
:customer的名字。
下面给出一条SQL的执行计划生成过程的例子。Sort和Limit被先后下推到LogicalView算子里面。
Sort和Limit下推可以达到提前过滤数据,减少网络传输,并行执行,减少PolarDB-X内存占用等效果。
> explain optimizer select * from customer order by c_custkey limit 10
下面给出一条SQL的执行计划生成过程的例子。Agg被下推到LogicalView算子里面。
Agg下推可以达到提前过滤数据,减少网络传输,并行执行,减少PolarDB-X内存占用等效果。
> explain optimizer select count(*) from customer group by c_nationkey;
拆分键为c_nationkey情况:
拆分键不为c_nationkey情况:
JOIN下推需要满足以下条件:
此外,任意表JOIN广播表总是可以下推。
> explain optimizer select * from t1, t2 where t1.id = t2.id;
下面给出一条SQL的执行计划生成过程的例子。JOIN下推到LogicalView算子里面。JOIN下推可以达到计算离存储更近,并行执行加速的效果。
当有多个表JOIN的情况,PolarDB-X会通过join clustering的优化技术将JOIN进行重排序,将可下推的JOIN放到相邻的位置,从而让它可以被下推下去。下面是一个例子:
假设原JOIN顺序为t2、t1、l2, 经过重排序之后,t2 JOIN l2依然能下推到了LogicalView。
> explain select t2.id from t2 join t1 on t2.id = t1.id join l2 on t1.id = l2.id;
Project(id="id")
HashJoin(condition="id = id AND id = id0", type="inner")
Gather(concurrent=true)
LogicalView(tables="t2_[0-3],l2_[0-3]", shardCount=4, sql="SELECT `t2`.`id`, `l2`.`id` AS `id0` FROM `t2` AS `t2` INNER JOIN `l2` AS `l2` ON (`t2`.`id` = `l2`.`id`) WHERE (`t2`.`id` = `l2`.`id`)")
Gather(concurrent=true)
LogicalView(tables="t1", shardCount=2, sql="SELECT `id` FROM `t1` AS `t1`")
下面给出一条SQL的执行计划生成过程的例子。子查询下推到LogicalView算子里面。
子查询下推可以达到计算离存储更近,并行执行加速的效果。
explain optimizer select * from t1 where id in (select id from t2);
在文档使用中是否遇到以下问题
更多建议
匿名提交