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 | 查詢優化控制開關。取值范圍如下:
|
loose_having_cond_pushdown_mode | Global | 控制在何種節點上開啟條件下推(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));