PolarDBは、結合条件を具体化された派生テーブルにプッシュダウンできます。 この機能を使用すると、JOIN
ステートメントのON
句からpushdownルールに準拠した条件式を直接具体化された派生テーブルに転送できます。 データフィルタリングプロセスを進めることによって、述語条件が可能な限り早くデータソースに適用されることを保証し、それによって後続の処理のためのデータ量を減らし、クエリ性能を向上させる。
このトピックで説明する具体化された派生テーブルの条件プッシュダウン機能は、標準の結合条件プッシュダウン (JPP) 機能とは異なり、適用可能なシナリオは異なります。 ここでのプッシュダウン技術は、WHERE
述語の等価性に依存し、具体化された派生テーブルとその後のプッシュダウンのみに依存する単一テーブル条件の派生を可能にします。 このヒューリスティックルールは通常、SQL実行パフォーマンスを向上させます。 対照的に、JPPは、マルチテーブル条件を含むon
述語に焦点を当てています。これは、パフォーマンスの向上を保証することなく、プッシュダウン中のコスト推定に基づいて関連するサブクエリに変換されます。 詳細については、「結合条件のプッシュダウン」をご参照ください。
前提条件
この機能は、次のデータベースエンジンを使用するクラスターでサポートされています。 データベースエンジンのバージョンを照会する方法の詳細については、「エンジンバージョン5.6、5.7、8.0」をご参照ください。
リビジョンバージョン8.0.1.1.44以降のMySQL 8.0.1。
リビジョンバージョン8.0.2.2.25以降のMySQL 8.0.2。
制限事項
具体化された派生テーブルに
LIMIT
句がある場合、プッシュダウンは許可されません。 設定例:SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c LIMIT 2) dt ON t1.a < dt.a AND t1.a = 1;
外側のWHERE条件式の列、または具体化された派生テーブルの対応する列にマップされた列が次のいずれかの条件を満たす場合、プッシュダウンはサポートされません。
この列はサブクエリを参照するか、非決定論的です。 例:
SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c) dt ON t1.a < dt.a AND t1.a = RAND();
列はストアドプロシージャまたは関数の一部です。 例:
CREATE FUNCTION f1() RETURNS INT BEGIN ... END; SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c) dt ON t1.a < dt.a AND t1.a = f1();
使用状況
準備
条件pushdown機能を使用する前に、ビジネスニーズに応じてloose_join_cond_push_into_derived_mode
パラメーターを設定します。 詳細な手順については、「クラスタおよびノードパラメータの設定」をご参照ください。
次の表にパラメーターを示します。
パラメーター名 | レベル | 説明 |
loose_join_cond_push_into_derived_mode | グローバル | 結合条件から派生テーブルへの条件プッシュダウン機能の制御スイッチ。 有効な値:
|
例
条件式のすべての列 (または同等の列) が具体化された派生テーブルから生成されている場合、条件をそのテーブルにプッシュダウンできます。
次のコードを実行してサンプルテーブルを作成します。
CREATE TABLE t1 (a INT, b INT, c INT, d INT);
CREATE TABLE t2 (e INT, f INT, g INT);
loose_join_cond_push_into_derived_mode
をON
に設定して機能を有効にし、次のコードを実行します。EXPLAIN FORMAT=TREE SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a = 1;
サンプル結果:
-> Left hash join (no condition) -> Filter: (t1.a = 1) (cost=0.55 rows=1) -> Table scan on t1 (cost=0.55 rows=3) -> Hash -> Table scan on dt -> Materialize -> Filter: (t2.x > 1) (cost=0.45 rows=1) -> Table scan on t2 (cost=0.45 rows=2)
説明クエリプランでは、
WHERE
句からの同値t1.a = 1
がJOIN
述語に正常に渡され、dt.x > 1
が派生テーブルdt
に効果的にプッシュされます。 その結果、dt
のデータ量が低減され、クエリ性能が改善される。loose_join_cond_push_into_derived_mode
をOFF
に設定し、次のコードを実行します。EXPLAIN FORMAT=TREE SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a=1;
サンプル結果:
-> Left hash join (no condition) -> Filter: (t1.a = 1) (cost=0.55 rows=1) -> Table scan on t1 (cost=0.55 rows=3) -> Hash -> Filter: (dt.x > 1) -> Table scan on dt -> Materialize -> Table scan on t2 (cost=0.45 rows=2)
説明loose_join_cond_push_into_derived_mode
をOFF
に設定すると、条件dt.x > 1
は派生テーブルにプッシュダウンされず、派生テーブルが具体化された後にのみフィルタリングが実行されます。