关于数据库:SQL-改写系列七谓词移动

42次阅读

共计 3316 个字符,预计需要花费 9 分钟才能阅读完成。

系列文章导读

OceanBase 是 100% 自主研发,间断 9 年稳固撑持双 11,翻新推出“三地五核心”城市级容灾新规范,是 寰球惟一 在 TPC-C 和 TPC-H 测试上都刷新了世界纪录的国产原生分布式数据库,于 2021 年 6 月份正式凋谢源代码。查问优化器是关系数据库系统的外围模块,是数据库内核开发的重点和难点,也是掂量整个数据库系统成熟度的“试金石”。为了帮忙大家更好地了解 OceanBase 查问优化器,咱们将撰写查问改写系列文章,带大家更好地把握查问改写的精华,相熟简单 SQL 的等价性,写出高效的 SQL。本文是 OceanBase 改写系列第七篇,将重点和大家介绍一下谓词挪动的技术,欢送探讨~

专栏作者介绍

OceanBase 优化器团队,由 OceanBase 高级技术专家溪峰、技术专家山文等领衔,致力于打造寰球当先的分布式查问优化器。

系列内容形成

本次查问改写系列不仅包含子查问优化、聚合函数优化、窗口函数优化、简单表达式优化四大模块,另外还有更多模块内容,敬请期待!本文将通过介绍谓词挪动的局部下推和上拉场景,来帮忙读者疾速了解这两个策略的概念和作用。欢送关注 OceanBase 开源用户群 钉钉号:33254054),进群与 OceanBase 查问优化器团队一起交换。

一、引言

优化谓词推导晋升查问性能是至关重要的。谓词能够呈现在一个 SQL 的多个地位上,能够是主查问的 Where/Having 子句;也能够是子查问的 Where/Having 子句。上一篇文章《SQL 改写系列六:谓词推导》介绍了谓词推导只能对每个字句进行独立优化;无奈对它们进行综合优化。本文将重点介绍 谓词挪动技术,它能够改良一个谓词在 SQL 中呈现的地位,也能够综合多个地位上的谓词进行推导优化。

二、谓词下推

谓词用于过滤数据。一般来说,尽早地进行数据过滤,能够缩小两头后果集的大小,缩小后续计算须要解决的数据量。因而,谓词的一个重要优化点是谓词下推。这个优化策略的次要作用是,尽可能的“下压”谓词,提前过滤掉局部数据。

在这一节中,咱们将以 Q1 为例,介绍谓词下推的几种场景。



Q1: 
SELECT V1.C1, V2.C2, V1.M1, V2.M2 
FROM
    (SELECT C1, 0 AS C2,  MAX(C3) as M1 FROM T1 GROUP BY C1) V1,
    (SELECT C1,      C2,  AVG(C3) as M2 FROM T2 GROUP BY C1, C2 HAVING M2 > 0) V2
WHERE V1.C1 = V2.C1 AND V1.C2 = V2.C2 AND V1.M1 > V2.M2 AND V1.C1 > 10;

Q1 的 FROM 局部是两个内联视图 V1V2。Q1 主查问的 WHERE 局部有多个谓词。其中 V1.C1 > 10是视图 V1上的单表过滤条件。谓词下推能够将它推入到视图外部。

1、谓词推入视图

显然,咱们能够将 V1.C1 > 10 这个谓词移到 V1 外部。在这里,因为 V1 存在分组聚合操作,因而,从外层下推的谓词是放到 Having 子句中。

V1.C1 > 10 推入视图

V1-1: SELECT C1, 0 AS C2,  MAX(C3) as M1 FROM T1 GROUP BY C1 HAVING C1 > 10

通过谓词下推之后,V1 的输入保障了 C1 > 10是必然成立的。因而,原始主查问中 V1.C1 > 10的断定后果是恒真的,这是一个冗余的谓词,能够间接移除。

2、谓词推入分组

Having 子句中的谓词还能够尝试进一步下推。能够看到,C1 > 10是分组列上的谓词。它在分组之前或者分组之后执行产生的成果是完全相同的。咱们将其压入到 Where 子句中,能够提前过滤掉局部数据,缩小 GROUP BY 操作须要解决的数据量。

C1 > 10 推入 WHERE

V1-2: SELECT C1, 0 AS C2, MAX(C3) AS M1 FROM T1 WHERE C1 > 10 GROUP BY C1;

当然,并不是所有 Having 中的谓词都能够下推到 Where 中。V2 中存在一个谓词 M2 > 0,这个谓词援用了一个聚合函数 AVG(C3)。聚合函数的后果依赖于分组聚合计算。因而,这个谓词无奈下压到分组操作之前。

3、谓词下推和谓词推导

Q1 原始查问中只有 V1 和 V2 的连贯谓词、以及 V1 上的谓词。但通过上一篇文章中介绍的谓词推导技术,咱们能够推导出 V2 的过滤谓词:V2.C1 > 10。这个推导谓词同样能够压入到 V2 中,优化 V2 的计算。能够看到,谓词推导和谓词下推是相互作用的。推导能够产生更多的下推的机会。同样的,下推之后,也能够产生更多的推导机会。利用这两种优化策略,咱们能够将 Q1 优化为以下查问:

Q1 初步优化后果:SELECT V1.C1, V1.C2, V1.M1, V2.M2 
FROM
 (SELECT C1, 0 AS C2, MAX(C3) AS M1
  FROM T1
  WHERE C1 > 10
  GROUP BY C1) V1,
 (SELECT C1, C2, AVG(C3) AS M2
  FROM T2
  WHERE C1 > 10
  GROUP BY C1, C2 HAVING M2 > 0) V2
WHERE V1.C1 = V2.C1 AND V1.C2 = V2.C2 AND V1.M1 > V2.M2;

通过谓词推导和下推,咱们对 Q1 进行了肯定的优化。那以上后果是否为优化的最终答案呢?答案是否定的。接下来,咱们将介绍另外一种重要的优化技术:谓词上拉。它能够进一步优化查问。

三、谓词上拉

本节介绍另外一种谓词的优化技术 – 谓词上拉。从名字了解,读者可能会直观地认为这是一种反向的优化策略,用来提早谓词的过滤。笔者须要强调,这种了解 是谬误的 。谓词上拉 并不是 谓词下推的反向优化。它次要是将内层子查问中的谓词“上拉”到外层查问中,参加外层的谓词推导过程,帮忙生成更多有意义的谓词。接下来,咱们持续通过剖析 Q1 的优化点,来向读者介绍一些谓词上拉的场景。

1、谓词上拉

V2 视图中存在一个 Having 谓词 M2 > 0。对主查问来说,V2 的输入必然满足了 V2.M2 > 0;联合主查问中已有谓词 V1.M1 > V2.M2,咱们能够推导失去 V1.M1 > 0。显然,这个推导谓词能够下推到 V1 视图中。读者能够回顾上一篇中介绍的推导技术。V1依据 MAX(C3) > 0能够进一步推导产生一个 Where 过滤谓词 C3 > 0

上拉 M2 > 0,推导 M1 > 0 并推入 V1,再次推导生成 C3 > 0 

V1-3: SELECT C1, 0 AS C2, MAX(C3) AS M1 
      FROM T1 WHERE C1 > 10 AND C3 > 0
      GROUP BY C1

2、常量上拉

V1 视图中存在一个非凡的投影表达式 0 AS C2。对主查问来说,V1 的输入必然满足了 V1.C2 = 0;联合主查问中已有的谓词 V1.C2 = V2.C2,咱们能够推导失去 V2.C2 = 0。显然,这个谓词也能够推入到 V2中。



上拉 V1.C2 = 0,推导 V2.C2 = 0 并推入 V2

V2-1: SELECT C1, C2, AVG(C3) AS M2 
      FROM T2 WHERE C1 > 10 AND C2 = 0
      GROUP BY C1, C2 HAVING M2 > 0

能够看到,谓词上拉次要作用是把一个内联视图中的谓词“上拉”到主查问中,它能够参加主查问的谓词推导,帮忙产生更多新谓词。这些新生成的谓词又会取得新的下压机会。综合三种优化技术,Q1 能够最终被优化为:

Q1 最终优化模式:SELECT V1.C1, V1.C2, V1.M1, V2.M2 
FROM
 (SELECT C1, 0 AS C2, MAX(C3) AS M1 
  FROM T1
  WHERE C1 > 10 AND C3 > 0 
  GROUP BY C1) V1, 
 (SELECT C1, C2, AVG(C3) AS M2
  FROM T2
  WHERE C1 > 10 AND C2 = 0
  GROUP BY C1, C2 HAVING M2 > 0) V2
WHERE V1.C1 = V2.C1 AND V1.M1 > V2.M2;

四、总结

本文次要介绍了谓词挪动的技术。它蕴含两个方面,谓词下推和谓词上拉。前者负责尽可能提前去执行过滤谓词,缩小后续操作须要解决的数据量;后者次要结构更多的谓词来参加推导过程,强化推导的成果。谓词推导和谓词挪动是相互合作、相互强化的,它们是十分重要的两项谓词优化技术。本文介绍了局部下推和上拉的场景,帮忙读者了解这两个策略的概念和作用。针对谓词的优化还有很多能够介绍的内容。将来有机会,咱们会持续介绍一些 OceanBase 在谓词推导或者挪动方面积攒的优化能力。

正文完
 0