您的位置:首页 > 文旅 > 旅游 > 网站推广的搜索引擎推广_建筑行业一般在哪个网站招聘_网站优化外包费用_优化方案官方网站

网站推广的搜索引擎推广_建筑行业一般在哪个网站招聘_网站优化外包费用_优化方案官方网站

2025/2/9 3:21:29 来源:https://blog.csdn.net/OceanBaseGFBK/article/details/141279002  浏览:    关键词:网站推广的搜索引擎推广_建筑行业一般在哪个网站招聘_网站优化外包费用_优化方案官方网站
网站推广的搜索引擎推广_建筑行业一般在哪个网站招聘_网站优化外包费用_优化方案官方网站

背景

在通常情况下,当遇到包含any/all子查询的语句时,往往需要遵循嵌套执行的方式,因此其查询效率较低。Oceanbase中制定了相应的any/all子查询优化规则,能够能够识别并优化符合条件的any/all子查询,从而有效提升查询的性能。

any/all子查询优化规则的基本原理

any/all子查询优化规则主要包含对以下两种情况的处理:

  1. min/max改写:当any/all子查询的表达式类型为比较运算符时,将子查询改写为min/max聚合子查询。
  2. 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函数进行优化,执行流程如下:

  1. 调用transform_any_all_as_min_max函数对any/all子查询语句进行min/max改写。
  2. 调用eliminate_any_all_before_subquery函数将单表达式的any/all子查询转化为普通子查询。

transform_any_all_as_min_max函数负责将any/all子查询改写为聚合子查询,能够被改写的子查询需要满足如下条件:

  1. 子查询对应的表达式必须为>,>=,<,<=中的一种。
  2. 子查询必须只包含一个select列,且该列需要属于某个索引前缀。
  3. 如果子查询为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 云数据库现已支持免费试用,现在申请,体验分布式数据库带来全新体验吧 ~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com