はじめに
Verticaはテーブルの内部的な結合処理方法としてHASH JOINとMERGE JOINの2種類があり、どちらの結合処理方法を使用するかはVerticaのオプティマイザが判断しています。本記事ではそれぞれの結合処理方法の概要と使い分けを説明します。
HASH JOIN
HASH JOINアルゴリズムを使用して、結合する2つのテーブルの内、小さい方のテーブルの結合列をキーとするHASHテーブルを、メモリ上に作成します。次に、大きい方のテーブルをスキャンし、HASHテーブルを使用しながら結合条件に一致する行を結合します。
MERGE JOIN
結合する2つのテーブルのプロジェクションが結合キーとなる列でソートされている場合、ソートされたそれぞれの行を結合条件を元にマージします。なお、MERGE JOINが使用できるのは、SELECTとINSERT処理のみです。
HASH JOINとMERGE JOINの使い分け
MERGE JOINは結合する2つのテーブルのプロジェクションが結合キーとなる列でソートされていないと使用できないため、多くの場合はHASH JOINが使用されます。(どちらの結合方法を使用するかはVerticaのオプティマイザが判断します。)例)table1、table2のプロジェクションがcol1列でソートされている場合
以下の場合は、ソートされていないcol2列が結合キー列のため、HASH JOINが選択されます。
<実行計画抜粋>
1 2 3 4 5 6 |
EXPLAIN SELECT * FROM table1 AS a INNER JOIN table2 AS b ON a.col2=b.col2; Access Path: +-JOIN HASH [Cost: 25, Rows: 2] (PATH ID: 1) Inner (BROADCAST) | Join Cond: (a.col1 = b.col1) | Materialize at Output: a.col2 |
以下の場合は、ソートされているcol1列が結合キー列のため、MERGE JOINが選択されます。
<実行計画抜粋>
1 2 3 4 5 |
EXPLAIN SELECT * FROM table1 AS a INNER JOIN table2 AS b ON a.col1=b.col1; Access Path: +-JOIN MERGEJOIN(inputs presorted) [Cost: 25, Rows: 2] (PATH ID: 1) Inner (BROADCAST) | Join Cond: (a.col2 = b.col2) |
HASH JOINはHASHテーブルがメモリ内に収まる場合は高速に処理することができますが、大規模テーブル同士の結合でメモリ内で処理できない場合はディスク上でHASH JOINをやり直すため、処理に時間がかかる可能性があります。
このような場合は、MERGE JOINが使用できるプロジェクションの作成を検討してください。
MERGE JOINはメモリ上にテーブルを作成する必要がないため、少ないメモリで結合処理を行うことができます。
参考情報
vsql上でプロジェクションのソート順を確認する方法http://vertica-tech.ashisuto.co.jp/projection_columns/
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。更新履歴
2019/4/8 検証バージョンを9.2に変更2016/07/21 本記事を公開