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

PolarDB:派生テーブルの場所

最終更新日:Jun 05, 2024

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

前提条件

ご使用のクラスターは、リビジョンバージョンが8.0.2.2.13以降のPolarDB for MySQL 8.0クラスターです。 クラスターバージョンの表示方法については、「エンジンバージョンの照会」をご参照ください。

制限

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

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

  • 外側の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 *
       t1から、(
                  セレクトx
                  t2から
                  グループBY x
               ) d_tab、t2
       WHERE t1.a = d_tab.x
               AND t1.a > 6; 

サンプル結果:

SELECT *
        t1から、(
                   セレクトx
                   t2から
                   どこx > 6
                   グループBY x
                ) d_tab
        WHERE t1.a = d_tab.x
                AND t1.a > 6; 

例 2:

SELECT f1
    から (
SELECT (
SELECT f1
t1から
リミット1
) f1として
t1から
ユニオン
セレクトf2
t2から
    ) dt
    どこf1 = 1; 

サンプル結果:

SELECT f1
    から (
SELECT (
SELECT f1
t1から
リミット1
) f1として
t1から
ユニオン
セレクトf2
t2から
どこf2 = 1
    ) dt
    どこf1 = 1; 

例 3:

SELECT *
   から (
SELECT f1, f2
t1から
   ) dt
   グループBY f1
   持っているf1 < 3
   そしてf2 > 11
   そしてMAX(f3) > 12; 

サンプル結果:

SELECT *
   から (
SELECT f1, f2
t1から
どこf1 < 3
   ) dt
   どこf1 < 3
   グループBY f1
   持っているf2 > 11
   そしてMAX(f3) > 12;