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 条件を派生テーブルにプッシュダウンするかどうかを指定します。有効な値:
|
例
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;