PolarDB支援謂詞推導,即通過深入分析現有SQL查詢中的謂詞條件,能夠有效地提取並推匯出新的謂詞。這一過程不僅局限於等值關係的解析,也包括非等值關係的推導。通過這一機制,PolarDB能夠產生更具針對性的謂詞條件,從而為查詢最佳化工具提供更有效資訊。在查詢最佳化的過程中,謂詞的有效性直接影響到最佳化器在選擇索引和確定串連順序等關鍵決策時的表現。通過推匯出的新謂詞,最佳化器可以在搜尋執行計畫時考慮到更多的可能性,進而提高查詢效能。
版本限制
適用的資料庫引擎版本為MySQL 8.0.2,且小版本需為8.0.2.2.23及以上版本。如何查看核心版本,請參見查詢版本號碼。
使用情境
在謂詞下推(條件下推)的過程中,PolarDB通過謂詞推導的方式增強其最佳化能力。謂詞下推包括但不限於以下幾種實現方式:
HAVING下推至WHERE的條件下推:將可以在彙總前應用的HAVING條件轉換為WHERE條件,以減少參與彙總的資料量。更多資訊,請參見條件下推(HAVING to WHERE)。WHERE條件下推至派生表:將外部查詢的WHERE條件下推到派生表中,以便更早地過濾資料。更多資訊,請參見條件下推(WHERE條件下推派生表)。WHERE子句下推至IN子查詢:將外部查詢的WHERE條件下推到IN子查詢中,提高子查詢的執行效率。更多資訊,請參見條件下推(WHERE子句下推至IN子查詢)。串連條件下推至物化派生表:將串連條件直接應用於物化派生表,以減少不必要的資料掃描。更多資訊,請參見條件下推(串連條件下推至物化派生表)。
謂詞推導的主要目標是產生儘可能多的單表條件,而不是為了排列組合推匯出任意兩個變數之間的關係。通過謂詞推導,系統能夠識別並產生新的、有效過濾條件,這些條件可以在後續的最佳化階段中用於進一步縮小資料集,從而提高查詢效能和效率。這一過程不僅增強了PolarDB在謂詞下推方面的能力,還確保了查詢最佳化工具能夠更智能地處理複雜的查詢邏輯,最終提升系統的整體效能。
主要包括以下情境:
非等值/等值簡單謂詞推導,樣本如下:
-- 原SQL SELECT * FROM t1, v1 WHERE v1.a > t1.a AND t1.a > 1 -- 推導後的SQL SELECT * FROM t1, v1 WHERE v1.a > t1.a AND t1.a > 1 AND v1.a > 1 -- 原SQL SELECT * FROM t1, v1 WHERE v1.b < t1.c AND t1.c < t2.c AND t2.c = 1; -- 推導後的SQL SELECT * FROM t1, v1 WHERE v1.b < t1.c AND t1.c < t2.c AND t2.c = 1 AND v1.b < 1 AND t1.c < 1;對於符合交換律的運算式,也可以參與謂詞推導,樣本如下:
-- 原SQL SELECT * FROM t1, v2 WHERE v2.c1 < t1.c2 + t1.c1 AND t1.c1 + t1.c2 < 2; -- 推導後的SQL SELECT * FROM t1, v2 WHERE v2.c1 < t1.c2 + t1.c1 AND t1.c1 + t1.c2 < 2 AND v2.c1 < 2;基於等值關係的複雜謂詞推導,樣本如下:
-- 原SQL SELECT * FROM t3, v3 WHERE v3.c2 = t3.c2 AND t3.c2 LIKE "%00%"; -- 推導後的SQL SELECT * FROM t3, v3 WHERE v3.c2 = t3.c2 AND t3.c2 LIKE "%00%" AND v3.c2 LIKE "%00%"; -- 原SQL SELECT * FROM t1, v2 WHERE v2.c1 = t1.c2 AND t1.c2 IN (1,5,7); -- 推導後的SQL SELECT * FROM t1, v2 WHERE v2.c1 = t1.c2 AND t1.c2 IN (1,5,7) AND v2.c1 IN (1,5,7);HAVING中MIN/MAX推導,樣本如下:
-- 原SQL SELECT * FROM t1 GROUP BY a,b,c HAVING MAX(b) > 20; -- 推導後的SQL SELECT * FROM t1 WHERE b > 20 GROUP BY a,b,c; -- 原SQL SELECT * FROM t1 GROUP BY a,b,c HAVING MIN(b) < 20; -- 推導後的SQL SELECT * FROM t1 WHERE b < 20 GROUP BY a,b,c;
使用限制
在整個謂詞推導過程中,只有在滿足相同比較類型條件的前提下,才能將這些謂詞統一進行推導,樣本如下:
CREATE TABLE t1(c1 INT, c2 INT); CREATE TABLE t2(c1 INT, c2 VARCHAR(64)); CREATE view v2 AS SELECT * FROM t2; SELECT * FROM v2,t1 WHERE v2.c1 > t1.c2 AND t1.c2 > v2.c2;說明樣本SQL中
v2.c2是VARCHAR類型,雖然看起來可以通過中間變數t1.c2傳遞非等值關係,但由於v2.c1是INT類型,v2.c2是VARCHAR類型,t1.c2作為INT類型,在分別跟v2.c1和v2.c2比較時是用不同類型的取值方式,因此強行推導之後是不符合SQL原始語義的。MIN/MAX函數的推導僅適用於SQL查詢中存在且僅存在單一的MIN/MAX彙總函式的情況。如果查詢中包含其他類似的彙總函式,則在WHERE子句中推匯出的謂詞條件可能會影響這些其他彙總函式的計算結果,從而導致推導後的SQL與原始SQL之間出現不等價的情況。樣本如下:SELECT a, MIN(b), AVG(c) FROM t1 GROUP BY a HAVING MIN(b) < 20;說明樣本SQL中存在兩個彙總函式,分別是
AVG(c)和MIN(b),若按規則推導b < 20至WHERE從句上,在表t1掃描過程中會過濾掉不滿足b < 20的行,這些被過濾掉的資料就不會對AVG(c)的值產生影響,因此對於某個分組來說,必然會影響AVG(c)值,查詢結果與原始語義不符,所以這種會影響其他彙總函式結果的情況並不支援MIN/MAX推導。
使用方法
準備工作
在使用該條件下推之前,您需要配置loose_predicate_deduce_mode參數來開啟謂詞推導功能。具體操作請參見設定叢集參數和節點參數。
參數名稱 | 層級 | 描述 |
loose_predicate_deduce_mode | Global | 謂詞推導功能控制開關。取值範圍如下:
|
MIN/MAX的推導沒有單獨的參數開啟,您可以通過設定loose_having_cond_pushdown_mode開啟條件下推(HAVING子句下推至WHERE子句)功能,MIN/MAX的推導功能也會隨之開啟。更多資訊,請參見條件下推(HAVING to WHERE)。
樣本1
-- 建立樣本用表
CREATE VIEW v1
AS
SELECT c1, c2, MAX(c3) AS max_c3
, AVG(c4) AS avg_c4
FROM t2
GROUP BY c1, c2
HAVING max_c3 > 10;
EXPLAIN FORMAT = TREE SELECT * FROM v1, t1 WHERE v1.c1 >= t1.c2 AND t1.c2 = v1.c2;
EXPLAIN
-> Inner hash join (t1.c2 = v1.c2)
-> Table scan on t1 (cost=0.18 rows=10)
-> Hash
-> Table scan on v1
-> Materialize
-> Filter: (max_c3 > 10)
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Filter: (t2.c1 >= t2.c2) (cost=0.75 rows=2)
-> Table scan on t2 (cost=0.75 rows=5)在條件下推(WHERE條件下推派生表)之前增加謂詞推導的流程,v1.c1 >= t1.c2 and t1.c2 = v1.c2通過非等值和等值關係的傳遞,可以得到單表條件v1.c1 > v1.c2,進而通過條件下推,將v1.c1 > v1.c2條件下壓到派生表中,轉換成派生表中對應的欄位t2.c1 >= t2.c2實現提前過濾資料。
樣本2
SELECT a, b, ee
FROM (
SELECT b, a, MIN(c) AS ee
FROM t1
GROUP BY a, b
) dt
GROUP BY a, b
HAVING MIN(ee) < 20;
-- 推導變換後========>
SELECT a, b, ee
FROM (
SELECT b, a, MIN(c) AS ee
FROM t1
WHERE c < 20
GROUP BY a, b
) dt
GROUP BY a, b;
-- 通過下面的查詢計劃也能看出應用MIN/MAX推導之後的結果
EXPLAIN FORMAT = TREE SELECT a, b, ee
FROM (
SELECT b, a, MIN(c) AS ee
FROM t1
GROUP BY a, b
) dt
GROUP BY a, b
HAVING MIN(ee) < 20;
EXPLAIN
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Table scan on dt
-> Materialize
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Filter: (t1.c < 20) (cost=*** rows=***)
-> Table scan on t1 (cost=*** rows=***)其中外層查詢的MIN(ee) < 20首先通過MIN/MAX推匯出dt.ee < 20條件下推到派生表dt之後,作為派生表內部的HAVING條件 MIN(c) < 20 進一步通過MIN/MAX推匯出 t1.c < 20, 在一系列變換後,過濾條件更靠近資料來源,起到加速查詢的效果。