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

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

最終更新日:Jun 14, 2025

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

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

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

  • MySQL 8.0.1 (リビジョン バージョン 8.0.1.1.42 以後)。

  • MySQL 8.0.2 (リビジョン バージョン 8.0.2.2.10 以後)。

制限事項

  • 条件式内のすべての列または同等の列がマテリアライズド派生テーブルからのものである場合、条件をマテリアライズドテーブルにプッシュダウンできます。

  • マテリアライズド派生テーブルに制限が課されている場合、条件はプッシュダウンできません。

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

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

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

背景情報

複雑なクエリが関係するシナリオでは、データベースは強力なプッシュダウン機能を提供してクエリを高速化する必要があります。PolarDB for MySQL は、MySQL Community Edition の条件プッシュダウン機能に基づいて WHERE to derived tables 機能を強化し、より優れたプッシュダウン機能を提供します。この強化には、以下の側面が含まれます。

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

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

  • WHERE to Derived Tables 機能は、HAVING to WHERE 機能と一緒に使用して、等価関係に基づいてプッシュダウンされた条件をさらにカスケードダウンできます。

使用方法

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

説明

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

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

パラメーター

パラメーター

レベル

説明

loose_derived_cond_pushdown_mode

グローバル

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

  • OFF: WHERE to derived tables 機能は無効になっています。

  • ON: WHERE to derived tables 機能は有効になっています。

  • REPLICA_ON (デフォルト): WHERE to derived tables 機能は、読み取り専用ノードでのみ有効になっています。

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;