ハッシュ結合は、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)