すべてのプロダクト
Search
ドキュメントセンター

PolarDB:WHERE句から派生テーブルに条件をプッシュダウンする

最終更新日:Dec 23, 2024

PolarDB for MySQLは、WHERE to派生テーブル機能をサポートしています。 この機能を使用して、特定の条件を満たす複雑なSQLクエリを変換できます。 派生テーブルを外部クエリにマージできない場合、外部WHERE条件が派生テーブルにプッシュダウンされ、SQLステートメントで処理する必要のある行数が削減されます。 これにより、SQL文のクエリのパフォーマンスが向上します。

サポートされているバージョン

クラスターは、次のいずれかのデータベースエンジンバージョンを実行します。 クラスターバージョンを表示する方法の詳細については、「エンジンバージョンの照会」をご参照ください。

  • リビジョンバージョンが8.0.1.1.42以降のMySQL 8.0.1

  • リビジョンバージョンが8.0.2.2.10以降のMySQL 8.0.2

制限事項

  • 条件式のすべての列または同等の列が具体化された派生テーブルからのものである場合、条件は具体化されたテーブルにプッシュダウンできます。

  • 具体化された派生テーブルに制限が課せられた場合、条件を押し下げることはできません。

  • 外側のWHERE条件式の列またはマテリアライズドテーブルにマップされた列に次のような状況が存在する場合、条件をプッシュダウンすることはできません。

    • 列の値は、サブクエリによって生成されるか、非決定論的です。 これは、同じ入力条件下で異なる結果が生成され得ることを意味する。

    • 列はストアドプロシージャまたはストレージ関数です。

背景情報

複雑なクエリが含まれるシナリオでは、データベースはクエリを高速化するために強力なプッシュダウン機能を提供する必要があります。 PolarDB for MySQLは、MySQL Community Editionの条件プッシュダウン機能に基づいてWHEREから派生テーブルへの機能を強化し、より優れたプッシュダウン機能を提供します。 強化には次の側面が含まれます。

  • 同等の条件を転送できます。

  • 派生テーブルが和集合である場合、指定された要件を満たす条件は、和集合の対応する部分にプッシュダウンできます。

  • WHEREから派生テーブルへの機能は、HAVINGからWHERE機能と一緒に使用して、等価関係に基づいてプッシュダウンされる条件をさらにカスケードダウンできます。

使用量

loose_derived_cond_pushdown_modeパラメーターを設定して、WHERE条件を派生テーブルにプッシュダウンできます。 このパラメーターを次の表に示します。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。

説明

次のコマンドを実行して、セッションレベルのデータベース接続の派生テーブルにWHERE条件をプッシュダウンすることもできます。

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

Parameters

パラメーター

レベル

説明

loose_derived_cond_pushdown_mode

グローバル

WHERE条件を派生テーブルにプッシュダウンするかどうかを指定します。 有効な値:

  • OFF (デフォルト): WHERE to派生テーブル機能は無効です。

  • ON: WHERE to派生テーブル機能が有効になっています。

  • REPLICA_ON: WHERE to派生テーブル機能は、読み取り専用ノードでのみ有効になります。

WHERE句から派生テーブルに条件をプッシュダウンします。

例 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;