OceanBaseデータベースのオプティマイザーは、並列実行を通じてSQLクエリの実行時間を最適化することをサポートしています。オプティマイザーでは、並列リソース量を並列度DOP(Degree of Parallelism)で表現できます。実際の業務シナリオにおいて、並列実行を有効にするかどうか、および必要なDOPの大きさについては、クエリの実行状況と業務要件を総合的に考慮し、経験則に基づいて必要な並列度を決定する必要があります。
OceanBaseデータベースは現在、Auto DOP、Hint、システム変数、Schema DOPなど、複数の方法でクエリの並列実行を有効にできます。ただし、以下のシナリオでは並列実行はサポートされていません:
- PL UDF/dblinkが関与するシナリオでは、クエリの並列実行の有効化は禁止されています。
- DASでスキャンされるベーステーブルでは、並列度の指定はサポートされておらず、計画形態では並列度が1と表示されます。
クエリが並列実行をサポートする場合、並列を有効にする複数の方法の優先順位は、高いものから低いものへの順に以下のとおりです:
- テーブルレベルの並列HintによるDOP設定
- グローバルな並列HintによるDOP設定
- システム変数によるDOP設定
- Schema DOP
テーブルレベルの並列HintによるDOP設定
テーブルレベルの並列HintによるDOP設定とは、Hint内でテーブルオブジェクトの並列度を直接指定することを指します。基本的な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;
クエリ内でHintを使用して並列度を指定していないテーブルについては、他の優先順位の低い方法でDOPが決定されます。例えば、クエリQ2では、テーブルt1のみをDOP = 8で並列実行するよう指定しています。他の方法で並列実行が有効になっていない場合、テーブルt2はDOP = 1、すなわち並列実行を有効にしない方法でスキャンされます。
Q2: SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2 WHERE t1.c1 = t2.c1;
グローバルな並列HintによるDOP設定
グローバルな並列Hintは、クエリがデフォルトで使用する並列度を指定するために使用されます。基本的なSQL構文は以下のとおりです:
/*+PARALLEL ( dop_value )*/
/*+PARALLEL ( AUTO )*/
/*+PARALLEL ( MANUAL )*/
例えば、クエリQ3では、PARALLEL( 8 )がクエリ内のテーブルt1とt2がどちらもDOP = 8を使用することを指定しています。
グローバルな並列Hintは、クエリが使用する並列度取得戦略を指定することもできます。例えば、クエリQ4では、PARALLEL ( AUTO )がクエリ内のすべてのテーブルがAuto DOPの並列度取得戦略を使用することを指定しています。
グローバルな並列Hintの優先順位はテーブルレベルの並列Hintよりも低いため、グローバルなHintとテーブルレベルのHintの両方が存在する場合、グローバルなHintはテーブルレベルのHintが無効なテーブルにのみ適用されます。例えば、クエリQ5では、テーブルt1はテーブルレベルのHintによりDOP = 8を使用し、テーブルt2はグローバルなHintにより並列度DOP = 4を使用します。クエリQ6では、テーブルt1はテーブルレベルのHintにより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;