
*本篇为「PolarDB优化器查询变换」系列第五篇,前四篇内容分别解读了:

谓词下推是一种优化技术,它可以将查询中的谓词(条件)尽可能地下推到数据源中进行处理,以减少数据的读取和处理量,提高查询效率。具体来说,谓词下推可以在查询过程中尽早地过滤掉不符合条件的数据,减少数据传输和处理,从而大幅提升查询性能。

SELECT i, jFROM (SELECT iFROM t1GROUP BY i) dt, t2WHERE i > 2AND j < 3;====变换后====>SELECT i, jFROM (SELECT iFROM t1WHERE i > 2GROUP BY i) dtWHERE j < 3;
-> SELECT_LEX::prepare-> push_conditions_to_derived_tables()-> 循环每一个物化表处理 WHERE condition-> make_cond_for_derived() // 生成可以下推到派生表的条件->extract_cond_for_table() //提取和当前只和派生表相关的条件- push_past_window_functions()//生成推到派生表HAVING Clause的条件- push_past_group_by()//生成推到派生表 WHERER Clause的条件- make_remainder_cond() //生成下推之后剩余的条件-> 自顶向下,产生的下推条件可以被下推到嵌套在派生表内部派生表->push_conditions_to_derived_tables() //递归
MySQL 8.0.29及以后的版本支持派生表条件下推优化可以用于UNION查询,虽然放开了对物化表是UNION的限制,但增加了以下限制:
● 如果UNION中的任何物化派生表是递归公共表表达式;
● 不能将包含不确定性表达式的谓词条件下推到派生表。

谓词条件下推到derived table增强版
SELECT *FROM t1, (SELECT xFROM t2GROUP BY x) d_tab, t2WHERE t1.a = d_tab.xAND t1.a > 6;====变换后====>SELECT *FROM t1, (SELECT xFROM t2WHERE x > 6GROUP BY x) d_tabWHERE t1.a = d_tab.xAND t1.a > 6;
虽然对于t1.a > 6条件,t1.a列并不依赖于派生表d_tab,但由于t1.a = d_tab.x的等值条件,我们可以推导出t1.a > 6条件是可以下推到derived table的,且按照映射关系转换为条件x > 6对物化表d_tab进行数据过滤,减少数据量的同时也减少了物化代价后后续数据的计算代价。当用户场景中的数据量大且条件过滤性好时,对于整个查询的性能提升十分明显。
SELECT f1FROM (SELECT (SELECT f1FROM t1LIMIT 1) AS f1FROM t1UNIONSELECT f2FROM t2) dtWHERE f1 = 1;====变换后====>SELECT f1FROM (SELECT (SELECT f1FROM t1LIMIT 1) AS f1FROM t1UNIONSELECT f2FROM t2WHERE f2 = 1) dtWHERE f1 = 1
在上面的SQL中,对于derived table是两个select的UNION,分别判断WHERE条件f1 = 1是否可以下推。对于SELECT#1有LIMIT,条件下推之后将影响结果的行数,因此不可以下推到SELECT#1;而检查SELECT#2则满足下推的检查,因此最终f1 = 1可以下推到SELECT#2的WHERER Clause上并映射为f2 = 1。
MySQL 8.0.29及以后的版本支持的“下推到UNION时优化”是:若UNION的某个子SELECT不支持下推,则该条件不能下推到该UNION的所有子SELECT。相比较而言,PolarDB支持下推到部分的UNION,在保证语义正确前提下,更大限度的支持条件下推。
▶︎ 下推后的条件可进一步基于等价关系级联下推
SELECT t1.a, MAX(t1.b)FROM t1GROUP BY t1.aHAVING t1.a > 2AND MAX(c) > 12;====变换后===>SELECT t1.a, MAX(t1.b)FROM t1WHERE t1.a > 2GROUP BY t1.aHAVING MAX(c) > 12;
SELECT *FROM (SELECT f1, f2FROM t1) dtGROUP BY f1HAVING f1 < 3AND f2 > 11AND MAX(f3) > 12;====变换后===>SELECT *FROM (SELECT f1, f2FROM t1WHERE f1 < 3) dtWHERE f1 < 3GROUP BY f1HAVING f2 > 11AND MAX(f3) > 12;

云原生数据库PolarDB建立了完善的谓词条件下推变换逻辑,在下推检查的过程中增加了对等值条件的考虑。同时,为了尽可能多的利用条件之间的传递关系,谓词条件下推到新的query block之后,原来的query block仍然保留下推下去的条件,以便在后续优化中更多的利用过滤条件。PolarDB后续会按照论文《Query Optimization by Predicate Move-Around》提出的谓词下推算法演进,进一步增强PolarDB的谓词下推能力。
云原生数据库PolarDB MySQL版开通免费试用啦!
面向国内1000万云上开发者,阿里云推出“飞天免费试用计划”。云原生数据库PolarDB MySQL版现推出3个月【免费试用】,快来领取吧!
点击文末 阅读原文 即刻开启云上实践之旅!



点击 阅读原文 免费试用 云原生数据库PolarDB





