全部產品
Search
文件中心

PolarDB:條件下推(WHERE條件下推派生表)

更新時間:Dec 11, 2024

PolarDB MySQL版支援條件下推(WHERE to Derived Tables)功能。對於滿足前提條件的複雜查詢,您可以通過該功能對SQL查詢進行變換。即當派生表(Derived Tables)不能合并到外部查詢時,將外部WHERE條件下推到派生表(Derived Tables)中減少SQL需要處理的行數,從而提升SQL查詢的效能。

前提條件

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

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

  • MySQL 8.0.2,且小版本需為8.0.2.2.10及以上版本。

使用限制

  • 如果條件運算式中的所有列(或對應的等價列)都來自物化的派生表(Derived Tables),則該條件可以下推至物化表。

  • 如果物化派生表(Derived Tables)有Limit限制,則禁止下推。

  • 外層WHERE條件運算式的列或者映射到物化表對應的列,存在以下情況則不支援下推:

    • 該列引用了子查詢或者是非確定性(相同的輸入條件下,可能會產生不同的結果);

    • 該列是預存程序或者儲存函數。

背景資訊

基於使用者複雜的查詢情境,資料庫需要更強大的下推能力來加速使用者查詢。PolarDB MySQL版基於社區版MySQL原有的條件下推功能進行了功能增強,實現了更加完善和強大的下推能力,主要包括以下方面:

  • 添加了等值條件的傳遞 ;

  • 在派生表(Derived Tables)是union的情境下,支援將符合的條件下推到union對應的部分;

  • 條件下推(HAVING to WHERE)配合使用,可將下推後的條件基於等價關係進一步級聯下推。

使用方法

您可以通過設定loose_derived_cond_pushdown_mode參數值來開啟從WHERE條件到派生表(Derived Tables)的條件下推功能。具體操作請參見設定叢集參數和節點參數

說明

您也可以在Session層級的資料庫連接中通過以下兩條命令開啟從WHERE條件到派生表(Derived Tables)的條件下推功能。

SET optimizer_switch="derived_condition_pushdown=on";
SET derived_cond_pushdown_mode=on;

參數說明

參數名稱

層級

描述

loose_derived_cond_pushdown_mode

Global

WHERE條件到派生表(Derived Tables)的條件下推功能控制開關。取值範圍:

  • OFF(預設值):關閉條件下推(WHERE to Derived Tables)功能。

  • ON:開啟條件下推(WHERE to Derived Tables)功能。

  • REPLICA_ON:僅在唯讀節點開啟條件下推(WHERE to Derived Tables)功能。

樣本

將條件從WHERE子句下推至派生表(Derived Tables)中。

樣本1:

       SELECT *
       FROM t1, (
                  SELECT x
                  FROM t2
                  GROUP BY x
               ) d_tab, t2
       WHERE t1.a = d_tab.x
               AND t1.a > 6;

條件下推變換後結果為:

      SELECT *
        FROM t1, (
                   SELECT x
                   FROM t2
                   WHERE x > 6
                   GROUP BY x
                ) d_tab
        WHERE t1.a = d_tab.x
                AND t1.a > 6;

樣本2:

    SELECT f1
    FROM (
	    SELECT (
		    	SELECT f1
		    	FROM t1
		    	LIMIT 1
		    ) AS f1
	    FROM t1
	    UNION
	    SELECT f2
	    FROM t2
    ) dt
    WHERE f1 = 1;

條件下推變換後結果為:

    SELECT f1
    FROM (
	    SELECT (
		    	SELECT f1
		    	FROM t1
		    	LIMIT 1
		    ) AS f1
	    FROM t1
	    UNION
	    SELECT f2
	    FROM t2
	    WHERE f2 = 1
    ) dt
    WHERE f1 = 1;

樣本3:

   SELECT *
   FROM (
	   SELECT f1, f2
	   FROM t1
   ) dt
   GROUP BY f1
   HAVING f1 < 3
   AND f2 > 11
   AND MAX(f3) > 12;

條件下推變換後結果為:

   SELECT *
   FROM (
	   SELECT f1, f2
	   FROM t1
	   WHERE f1 < 3
   ) dt
   WHERE f1 < 3
   GROUP BY f1
   HAVING f2 > 11
   AND MAX(f3) > 12;