OB小优系列文章 | 聚合类相关子查询提升(上)

  • 时间:
  • 浏览:1

OB君:查询优化器是关系数据库系统的核心模块,也是衡量整个数据库系统性心智成熟期期是什么 图片 图片 图片 图片 度的“试金石”。OceanBase的查询优化器历经了九年多时间的磨练,逐步提炼出一套独有的工程实践哲学。本系列文章将重点介绍聚合类相关子查询的改写机制,欢迎探讨~

在你是什么 场景中, film 的取值数量不必多。根据 film 的取值不同,Q3 实际生成的不同查询只能 200 个。但你是什么 200 个参数不同的查询却会被反复执行 10K+ 次。OB 君给的优化妙招是:用一另2个分组查询提前算出所有影片的平均售价,以前主查询只能使用不同的统计值时,可不上能 直接从提前计算的结果中获得。Q2 中的视图 V 实现了你是什么 效果,它只只能扫描一遍 TICKETS 表就可不上能 获得所有电影的平均售价。

S 君开了一家影院,生意红火。某一天,S 君想进一步改善影院的业绩,后会 知道有哪些场次票价相对偏低。

— 加入OceanBase钉钉互动群:搜索群号21949783

可不上能 看过,改写后的 SQL 在计划挑选 上有了更大空间。原始的 Q1 查询中,亲戚亲戚朋友只能利用主查询中的 PLAY 来驱动子查询的计算,本质上是一另2个 NEST LOOP JOIN 的过程。在改写后,亲戚亲戚朋友可不上能 采用更多的 JOIN 的算法,甚至可不上能 利用子查询提升产生的视图来驱动主查询中的表进行连接。

OceanBase 九年如一日,不忘初心,砥砺前行,致力于实现一另2个中国人完整篇 自主设计的分布式通用数据库系统,打破西方大厂在商业数据库领域的绝对垄断地位。时至今日,OceanBase 不可能 成功应用于蚂蚁金服的交易、支付、账务等核心系统和网商银行、印度Paytm等业务系统。

SPJ 相关子查询的除理难度是高于非相关查询的。而比前者更加简化的一类查询是:聚合类相关子查询。本系列文章重点介绍例如子查询的改写机制(简称为 JA 改写)。

非常欢迎有志于让中国的政府和企业用上中国人其他人的通用商业数据库的同学加入亲戚亲戚朋友,一并为实现你是什么 目标而一并努力!发送简历到 OceanBase-Public@list.alibaba-inc.com,亲戚亲戚朋友等的就如此 你!

以前,Q2只只能将PLAY和V按照film连接,就可不上能 快速找出有哪些排片的平均售价偏低了。从 Q1 -> Q2 的改写是将一另2个聚合类的相关子查询改写成了一次分组(GROUP BY) + 一次连接(JOIN)。改写后的查询预期只能扫描PLAY表和TICKETS表各一次,总计 5M + 行的记录;最后执行一次 200 : 10K 的内连接。相对于原始查询 2000 M+ 的预期数据访问量,执行带宽单位会有巨大的提升。倘若这两张表上有film字段的索引,如此 还能利用索引加速聚合和连接的运算带宽单位。

OB 君发现这条查询是一另2个“聚合类相关子查询”(简称为 JA 子查询,Join Aggregation)。例如查询的主要型态是:用户使用一另2个相关的子查询来计算一另2个统计值,但会 利用该统计值来对主查询的结果进行过滤。

当 S 君执行这条查询的以前,发现等了一分钟都如此 获得结果。万分焦急的 S 君向经验丰富的 OB 君求助:为有哪些如此 简单的查询执行的如此 慢?

— 想与蚂蚁金服OceanBase的技术专家深入交流?

为此,S 君写了下面这条查询。他用一另2个子查询统计了一部电影的平均售价,但会 找出定价偏低的排片场次有有哪些。PLAY表记录所有电影的排片信息;TICKETS 表记录了所有的售票信息。

JA 改写第一式可不上能很有效的提升聚合类子查询的除理带宽单位。但它并有的是一另2个劲适用的。通常亲戚亲戚朋友认为它有一另2个主要的局限性:

使用子查询可不上能 让用户简洁明了地写出含义清晰的简化SQL说说。你是什么 功能对用户而言是非常友好的,但会 对数据库而言是很不友好的。从数据库带宽而言,除理子查询是相对低效的。为了改进子查询的除理,数据库系统通常会尝试改写SQL,消除子查询。业务中常见的子查询含高以下几种:

传送门:

S 君仔细分析 Q1,发现这条查询是针对PLAY中的每一行,都只能去执行一次TICKETS上的聚合查询 Q3(其中 ?的取值由P.film决定)。

在下一篇文章中,亲戚亲戚朋友会介绍JA改写第二式,它可不上能很好的除理以上你是什么 另2个什么的问题。

OB 君分析了这两张表的具体情况,不禁感叹这家影院业绩甜得不错。他向 S 君解释道:你的影院效益太好,PLAY 表里排片有 10K+ ,每个排片有的是算一次电影的平均售价,影院总共也就上映了200场电影,票却售出了5M 张,平均每部电影就售出了 200 K 张票,如此 这条查询逻辑上要访问 10K * 200K = 2000 M 可不上能算出结果,一分钟怎样才能会不可能 算得出结果。X 君请求 OB 君帮个忙改进一下这条查询。OB 君祭出了一招:JA改写第一式,写下了查询Q2。

OB小优系列(一):OceanBase查询优化器的设计之道和工程实践

OB小优系列(二):OceanBase并行执行引擎实现OB小优系列(三):OceanBase查询改写的最佳实践

— 想了解更多OceanBase肩上的技术秘密?