条件下推(HAVING to WHERE)

PolarDB支持条件下推(HAVING to WHERE)功能。对于满足前提条件的复杂查询,您可以通过该功能对SQL查询进行变换,即将HAVING子句上可下推的条件下推至WHERE子句上,从而提升SQL查询的性能。

前提条件

集群版本需为PolarDB MySQL版8.0版本且修订版本为8.0.2.2.10或以上。如何查看集群版本,请参见查询版本号

使用限制

  • 如果条件(或部分条件)仅依赖于GROUP BY list中使用的字段,或仅依赖于与分组字段相等的字段,则可以将其从HAVING子句下推至WHERE子句。

  • 聚合函数不支持下推功能。

背景信息

很多复杂的查询中都用到了HAVING子句,可以通过条件过滤所需要的结果。位于HAVING子句中的条件一般需要等group by算子完成后再进行条件过滤。许多条件都可以下推至WHERE子句,如果您在尽可能早的查询阶段进行数据过滤,可以减少后续查询计算的代价,大幅提升查询性能。

使用方法

您可以通过loose_polar_optimizer_switch参数来开启从HAVING子句到WHERE子句的条件下推功能。并通过loose_having_cond_pushdown_mode参数来控制在哪些节点上开启该功能。具体操作请参见设置集群参数和节点参数

参数说明

参数名称

级别

描述

loose_polar_optimizer_switch

Global、Session

查询优化控制开关。取值范围如下:

  • 'having_cond_pushdown=ON'(默认):开启条件下推(HAVING to WHERE)功能。

  • 'having_cond_pushdown=OFF':关闭条件下推(HAVING to WHERE)功能。

loose_having_cond_pushdown_mode

Global

控制在何种节点上开启条件下推(HAVING to WHERE)功能。取值范围如下:

  • REPLICA_ON(默认):仅在只读节点开启条件下推(HAVINGtoWHERE子句)功能。

  • ON:在所有节点都开启条件下推(HAVING to WHERE子句)功能。

  • OFF:在所有节点都关闭条件下推(HAVING to WHERE子句)功能。

示例

将条件从HAVING子句下推至WHERE子句。

示例1:

SELECT t1.a,MAX(t1.b)
FROM t1
GROUP BY t1.a
HAVING (t1.a>2) AND (MAX(c)>12);

条件下推变换后结果为:

SELECT t1.a,MAX(t1.b)
FROM t1
WHERE (t1.a>2)
GROUP BY t1.a
HAVING (MAX(c)>12);

示例2:

SELECT t1.a,MAX(t1.b),t1.c
FROM t1
GROUP BY t1.a
HAVING ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));

条件下推变换后结果为:

SELECT t1.a,MAX(t1.b),t1.c
FROM t1
WHERE ((t1.a=t1.c) AND (t1.a>1)) OR (t1.a<3)
GROUP BY t1.a
HAVING ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));