全部產品
Search
文件中心

PolarDB:條件下推(HAVING to WHERE)

更新時間:Dec 11, 2024

PolarDB支援條件下推(HAVING to WHERE)功能。對於滿足前提條件的複雜查詢,您可以通過該功能對SQL查詢進行變換,即將HAVING子句上可下推的條件下推至WHERE子句上,從而提升SQL查詢的效能。

前提條件

叢集版本適用的資料庫引擎版本如下,如何查看叢集版本,請參見查詢版本號碼

  • MySQL 8.0.1,且小版本需為8.0.1.1.42及以上版本。

  • MySQL 8.0.2,且小版本需為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));