网站反向绑定域名,中国建设银行网站首页河西网点,网站建设好的,昆明企业建网站多少钱背景
在通常情况下#xff0c;当遇到包含any/all子查询的语句时#xff0c;往往需要遵循嵌套执行的方式#xff0c;因此其查询效率较低。Oceanbase中制定了相应的any/all子查询优化规则#xff0c;能够能够识别并优化符合条件的any/all子查询#xff0c;从而有效提升查询…背景
在通常情况下当遇到包含any/all子查询的语句时往往需要遵循嵌套执行的方式因此其查询效率较低。Oceanbase中制定了相应的any/all子查询优化规则能够能够识别并优化符合条件的any/all子查询从而有效提升查询的性能。 any/all子查询优化规则的基本原理
any/all子查询优化规则主要包含对以下两种情况的处理
min/max改写当any/all子查询的表达式类型为比较运算符时将子查询改写为min/max聚合子查询。any/all消除当any/all子查询的内容为单个表达式时将any/all子查询转换为普通子查询在simplify规则执行时会消除该子查询。
min/max改写
考虑如下情况
SELECT * FROM t1 WHERE c1 ALL(SELECT c1 FROM t2)
上述例子在默认情况下需要按照嵌套的方式执行即对父查询中的每一条记录都需要判断是否满足子查询中的条件。结合该语句的语义可以将子查询条件进行如下改写
SELECT * FROM t1 WHERE c1 ALL(SELECT max(c1) FROM t2)
经过改写后子查询被转换成了聚合子查询。在实际执行时可以将子查询先行聚合然后将得到的结果用于父查询的过滤从而大大提升了查询效率。 any/all消除
考虑如下情况
SELECT * FROM t1 WHERE c1 ALL(SELECT 100)
上述例子中的子查询为单表达式可以移除any/all如下所示
SELECT * FROM t1 WHERE c1 (SELECT 100)
在simpify规则执行时会进一步消除子查询。
代码解析
any/all子查询优化规则的入口为ObTransformSubqueryCoalesce::transform_one_stmt该函数最终调用do_transform_any_all函数进行优化执行流程如下
调用transform_any_all_as_min_max函数对any/all子查询语句进行min/max改写。调用eliminate_any_all_before_subquery函数将单表达式的any/all子查询转化为普通子查询。 transform_any_all_as_min_max函数负责将any/all子查询改写为聚合子查询能够被改写的子查询需要满足如下条件
子查询对应的表达式必须为中的一种。子查询必须只包含一个select列且该列需要属于某个索引前缀。如果子查询为all类型则select列必须为非空列。
该函数最终调用do_transform_any_all_as_min_max函数进行改写该函数主要将select列替换成对应列的min/max表达式对于all类型的子查询需要额外添加having非空条件如下所示
having max/min(col) is not null eliminate_any_all_before_subquery函数负责将单表达式的any/all子查询转换为普通子查询该函数执行逻辑较为简单这里不再赘述。 OceanBase 云数据库现已支持免费试用现在申请体验分布式数据库带来全新体验吧 ~