OceanBaseデータベースのオプティマイザーは、パラレル実行によってSQLクエリの実行時間を最適化することをサポートしています。オプティマイザーでは、並列度DOP(Degree of Parallel)を用いてパラレルリソース量を表現します。実際の業務シナリオにおいて、パラレル実行を有効にするかどうか、および必要なDOPの大きさについては、クエリの実行状況と業務要件を総合的に考慮し、経験則に基づいて必要な並列度を決定する必要があります。
OceanBaseデータベースは現在、Auto DOP、Hint、システム変数、Schema DOPなど、複数の方法でクエリのパラレル実行を有効にできます。ただし、以下のシナリオでは、現在パラレル実行はサポートされていません:
- PL UDF/dblinkが関与するシナリオでは、クエリのパラレル実行は禁止されています。
- DASでスキャンされたベーステーブルでは、並列度の指定はサポートされておらず、実行計画上の並列度は1と表示されます。
クエリがパラレル実行をサポートする場合、複数のパラレル実行有効化方法の優先順位は、高いものから低いものへと以下のとおりです:
- テーブルレベルのパラレルHintによるDOP設定
- グローバルパラレルHintによるDOP設定
- システム変数によるDOP設定
- Schema DOP
テーブルレベル並列ヒントによるDOPの設定
テーブルレベル並列ヒントによるDOPの設定とは、ヒント内でテーブルオブジェクトの並列度を直接指定することです。基本的なSQL構文は以下のとおりです:
/*+PARALLEL ( @qb_name table_name dop_value)*/
例えば、クエリQ1では、テーブルt1とt2をそれぞれDOP = 8およびDOP = 4で並列実行するよう指定しています。例:
Q1: SELECT /*+PARALLEL(t1 8) PARALLEL(t2 4)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
クエリ内でヒントを使用して並列度を指定していないテーブルについては、他の優先順位の低い方法によってDOPが決定されます。例えば、クエリQ2では、テーブルt1のみをDOP = 8で並列実行するよう指定しています。他の方法で並列処理を有効にしていない場合、テーブルt2はDOP = 1、つまり並列処理を有効にせずにスキャンされます。
Q2: SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
グローバル並列ヒントによるDOPの設定
グローバル並列ヒントは、クエリがデフォルトで使用する並列度を指定するために使用されます。基本的なSQL構文は以下のとおりです:
/*+PARALLEL ( dop_value )*/
/*+PARALLEL ( AUTO )*/
/*+PARALLEL ( MANUAL )*/
例えば、クエリQ3では、PARALLEL( 8 )により、クエリ内のテーブルt1とt2はどちらもDOP = 8を使用するよう指定されています。
グローバル並列ヒントは、クエリが使用する並列度取得戦略も指定できます。例えば、クエリQ4では、PARALLEL ( AUTO )により、クエリ内のすべてのテーブルがAuto DOPの並列度取得戦略を使用するよう指定されています。
グローバル並列ヒントの優先順位はテーブルレベル並列ヒントよりも低いため、グローバルとテーブルレベルの両方のヒントが同時に存在する場合、グローバルヒントはテーブルレベルヒントが適用されないテーブルに対してのみ有効になります。例えば、クエリQ5では、テーブルt1はテーブルレベルヒントによりDOP = 8を使用し、テーブルt2はグローバルヒントによりDOP = 4を使用します。クエリQ6では、テーブルt1はテーブルレベルヒントによりDOP = 8を使用し、テーブルt2はAuto DOP戦略に基づいて自動的にDOP値を取得します。
Q3: SELECT /*+PARALLEL(8)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
Q4: SELECT /*+PARALLEL(AUTO)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
Q5: SELECT /*+PARALLEL(t1 8) PARALLEL(4)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
Q6: SELECT /*+PARALLEL(t1 8) PARALLEL ( AUTO )*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
システム変数によるDOPの設定
並列度に関連するシステム変数は2種類あり、それぞれDOP取得戦略の設定と固定DOPの設定に使用されます。
DOP取得戦略の設定は、GLOBAlまたはSESSIONレベルでparallel_degree_policy変数を設定することで、Auto DOP戦略を有効にします。Auto DOP戦略では、一定のアルゴリズムに従ってテーブルオブジェクトのDOP値が計算されます。詳細については、Auto DOP戦略の有効化を参照してください。
グローバルPARALLELヒントでDOPを指定したり、Auto DOP戦略を有効にしたり、parallel_degree_policy変数でAuto DOP戦略を有効にした場合、固定DOPの設定は無効になります。その他のシナリオでは、以下の内部システム変数を使用して、クエリやDMLで使用する並列度を設定できます。例:
SET _enable_parallel_query = 1;
SET _enable_parallel_dml = 1;
SET _force_parallel_query_dop = 8;
SET _force_parallel_dml_dop = 8;
スキーマDOP
固定DOP戦略を使用し、以下の内部システム変数を使用して並列処理を有効に設定した場合でも、DOPを1に設定すると、クエリはテーブル作成時に指定されたDOPでテーブルのオブジェクトに対する並列実行を開始します。
SET _enable_parallel_query = 1;
SET _enable_parallel_dml = 1;
SET _force_parallel_query_dop = 1;
SET _force_parallel_dml_dop = 1;
以下の例では、テーブルt1の作成時にDOP = 8を指定します。ALTER TABLEを使用してテーブルt1のDOPを4に調整し、ALTER INDEXを使用してインデックスidx1のDOPを2に調整すると、その後のクエリは調整後のDOPを使用してテーブルのオブジェクトとインデックスに対する並列実行を開始します。
CREATE TABLE t1(c1 INT, c2 INT, c3 INT) PARALLEL 8;
CREATE INDEX idx1 ON t1(c1);
ALTER TABLE t1 PARALLEL 4;
ALTER INDEX idx1 PARALLEL 2;