日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

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

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

前提條件

集群版本需為PolarDB MySQL版8.0版本且修訂版本為8.0.2.2.13或以上。如何查看集群版本,請參見查詢版本號。

使用限制

  • 如果條件表達式中的所有列(或對應的等價列)都來自物化的派生表(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;