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

PolarDB:並列クエリでのハッシュ結合

最終更新日:May 31, 2024

ハッシュ結合は、MySQL Community Edition 8.0で導入された新しい結合実行方法です。 分析クエリの実行パフォーマンスを大幅に向上させることができます。 PolarDB for MySQLは、ハッシュ結合の並列実行を8.0サポートしています。 より多くの並列実行ポリシーが開発中であり、将来リリースされる予定です。 このトピックでは、PolarDBの並列クエリにハッシュ結合を使用する方法について説明します。

単純ハッシュ結合

前提条件

PolarDB for MySQL 8.0 Cluster Editionクラスターが使用され、リビジョンバージョンは8.0.2.1.0以降です。 バージョンの確認方法の詳細については、「エンジンバージョンの照会」をご参照ください。

Parallel executionポリシー 并行策略

上記の実行プランでは、並列度 (DOP) が4に設定されています。これは、PolarDBが4つのワーカーを使用して並列クエリを実行することを示しています。 まず、4人の作業員がテーブルt1を並行してスキャンする。 各ワーカーは、テーブルt1のデータの一部のみを使用してハッシュテーブルを作成します。 次に、4つのハッシュテーブルとテーブルt2との間でJOIN演算が実行される。

使用法

  • 構文:

    PolarDBでは、EXPLAIN FORMAT=TREEステートメントのみを使用して、ハッシュ結合が使用されているかどうかを確認できます。

  • 例:

    次の例では、2つのテーブルが作成され、データがテーブルに挿入されます。

    CREATE TABLE t1 (c1 INT, c2 INT);
    CREATE TABLE t2 (c1 INT, c2 INT);
    t1値 (1,1) 、(2,2) 、(3,3) 、(5,5) に挿入します。INSERT INTO t2値 (1,1) 、(2,2) 、(3,3) 、(5,5); 

    次の例は、ハッシュ結合を使用する場合のこれら2つのテーブルの実行計画を示しています。

    EXPLAINフォーマット=ツリー
     EXPLAIN
      -> 収集 (スライス: 1; ワーカー: 4) (コスト=10.82行=4)
        -> 並列内部ハッシュ結合 (t2.c2 = t1.c1) (コスト=0.57行=1)
            -> 並列パーティションを使用したt2の並列テーブルスキャン: 1 (コスト=0.03行=1)
            -> 並列ハッシュ
                -> 並列パーティションを使用したt1の並列テーブルスキャン: 1 (コスト=0.16行=1) 

    上記の実行計画では、DOPが4に設定されています。これは、PolarDBが4つのワーカーを使用して並列クエリを実行することを示しています。 まず、4人の作業員がテーブルt1を並行してスキャンする。 各ワーカーは、テーブルt1のデータの一部のみを使用してハッシュテーブルを作成します。 次に、4つのハッシュテーブルとテーブルt2との間でJOIN演算が実行される。 最後に、リーダーは結合された結果を収集して最終クエリ結果を生成します。

並列ハッシュ結合Parallel hash join

前提条件

PolarDB for MySQL 8.0 Cluster Editionクラスターが使用され、リビジョンバージョンは8.0.2.2.0以降です。 バージョンの確認方法の詳細については、「エンジンバージョンの照会」をご参照ください。

Parallel executionポリシー 并行策略

上記の実行計画では、DOPが4に設定されています。これは、PolarDBが4つのワーカーを使用して並列クエリを実行することを示しています。 まず、4人の作業員がテーブルt1を並行してスキャンする。 各ワーカーは、テーブルt1データのデータの一部のみを使用しますが、ビルド結果を同じロックフリー共有ハッシュテーブルに書き込みます。 構築段階が完了した後、4人のワーカーがテーブルt2テーブルをスキャンしてt2をスキャンし、データを並行してプローブします。 最後に、リーダーは結合された結果を収集して最終クエリ結果を生成します。

使用法

  • 構文:

    PolarDBでは、EXPLAIN FORMAT=TREEステートメントのみを使用して、ハッシュ結合が使用されているかどうかを確認できます。

  • 例:

    次の例では、2つのテーブルが作成され、データがテーブルに挿入されます。

    CREATE TABLE t1 (c1 INT, c2 INT);
    CREATE TABLE t2 (c1 INT, c2 INT);
    t1値 (1,1) 、(2,2) 、(3,3) 、(5,5) に挿入します。INSERT INTO t2値 (1,1) 、(2,2) 、(3,3) 、(5,5); 

    次の例は、ハッシュ結合を使用する場合のこれら2つのテーブルの実行計画を示しています。

    EXPLAINフォーマット=ツリー
    
    説明
    | -> 収集 (スライス: 1; ワーカー: 1) (コスト=12.46行=4)
        -> 並列内部ハッシュ結合 (t2.c1 = t1.c1) (コスト=2.06行=4)
            -> 並列パーティションを使用したt2の並列テーブルスキャン: 1 (コスト=0.09行=4)
            -> 並列ハッシュ
                -> 並列パーティションを使用したt1の並列テーブルスキャン: 1 (コスト=0.65行=4) 

シャッフルハッシュ参加

前提条件

PolarDB for MySQL 8.0 Cluster Editionクラスターが使用され、リビジョンバージョンは8.0.2.2.0以降です。 バージョンの確認方法の詳細については、「エンジンバージョンの照会」をご参照ください。

Parallel executionポリシー 并行策略

Parallel hash joinは、ビルドフェーズとプローブフェーズの両方で並列実行を実装します。 ただし、共有ハッシュテーブルが大きすぎると、I/O操作が実行されてデータがディスクにダンプされ、並列クエリの効率に影響します。 この問題を解決するために、パーティションハッシュ結合が使用されます。 上記の実行計画では、4つのワーカーがテーブルt1を並行してスキャンし、結合キーに基づいて次のフェーズのワーカーにデータを分割して配布し、各パーティションに小さなハッシュテーブルを作成します。 構築段階が完了した後、4つのワーカーは、テーブルt2をスキャンし、結合キーに基づいてデータを分割し、スモールハッシュテーブルの構築を完了したワーカーにデータを配布する。 プローブ操作が完了した後、リーダーは結合された結果を収集して最終クエリ結果を生成します。

使用法

  • 構文:

    PolarDBでは、EXPLAIN FORMAT=TREEステートメントのみを実行して、ハッシュ結合が使用されているかどうかを確認できます。

  • 例:

    次の例では、2つのテーブルが作成され、データがテーブルに挿入されます。

    CREATE TABLE t1 (c1 INT, c2 INT);
    CREATE TABLE t2 (c1 INT, c2 INT);
    t1値 (1,1) 、(2,2) 、(3,3) 、(5,5) に挿入します。INSERT INTO t2値 (1,1) 、(2,2) 、(3,3) 、(5,5); 

    次の例は、ハッシュ結合を使用する場合のこれら2つのテーブルの実行計画を示しています。

    EXPLAINフォーマット=ツリー
    
    説明
    | -> 収集 (スライス: 1; ワーカー: 2) (コスト=33.38行=4)
        -> 内部ハッシュ結合 (t2.c1 = t1.c1) (コスト=23.08行=2)
            -> 再分割 (ハッシュキー: t2.c1; スライス: 2; ワーカー: 1) (コスト=11.35行=2)
                -> 並列パーティションを使用したt2の並列テーブルスキャン: 1 (コスト=0.65行=4)
            -> ハッシュ
                -> 再分割 (ハッシュキー: t1.c1; スライス: 3; ワーカー: 1) (コスト=11.35行=2)
                    -> 並列パーティションを使用したt1の並列テーブルスキャン: 1 (コスト=0.65行=4)