OceanBaseデータベースのオプティマイザーは、パラレル実行によりSQLクエリの時間を最適化することをサポートしています。パラレル度DOP(Degree of Parallelism)は、パラレルリソース量を示すために使用されます。実際のビジネスシナリオでは、パラレル実行を有効にするかどうかおよびDOPの大きさを決定するには、クエリの実行状況とビジネス要件を総合的に考慮し、経験に基づいて構成する必要があります。
パラレル実行がサポートされないシナリオ
OceanBaseでは、現在以下のシナリオでパラレル実行を有効にすることは禁止されています:
- PL UDFまたはdblinkを含むクエリ:パラレル実行が直接禁止されます。
- DASスキャンのベーステーブル:DOPの指定はサポートされず、計画形態においてDOPは固定で1になります。
パラレル実行の有効化方法と優先順位
パラレル処理がサポートされるシナリオにおいて、設定方法の優先順位は高いものから低いものへと以下の通りです:
- テーブル単位のパラレルヒントによるDOP設定
- グローバルなパラレルヒントによるDOP設定
- システム変数によるDOP設定
- スキーマDOP
テーブルレベルのパラレルヒントによるDOPの設定
テーブルレベルのパラレルヒントでは、テーブルオブジェクトのDOPを直接指定できます。SQL構文は以下のとおりです:
/*+PARALLEL( @qb_name table_name dop_value )*/
例:
-- Q1:テーブルt1とt2にそれぞれDOP=8とDOP=4を指定する
SELECT /*+PARALLEL(t1 8) PARALLEL(t2 4)*/ *
FROM t1, t2
WHERE t1.c1 = t2.c1;
クエリ内でテーブルレベルのヒントによってDOPが指定されていない場合、指定されていないテーブル(Q2のt2など)は、優先順位の低い設定方式を採用します。
-- Q2:テーブルt1のDOPのみをDOP=8と指定し、テーブルt2のデフォルトDOPは1(他の方法で有効にならない場合)
SELECT /*+PARALLEL(t1 8)*/ *
FROM t1, t2
WHERE t1.c1 = t2.c1;
グローバルパラレルヒントによるDOPの設定
グローバルパラレルヒントでは、クエリのデフォルトDOPまたは並列度取得ポリシーを指定できます:
/*+PARALLEL(dop_value)*/ -- 固定DOPを指定
/*+PARALLEL(AUTO)*/ -- Auto DOPポリシーを有効にする
/*+PARALLEL(MANUAL)*/ -- Auto DOPを無効にし、明示的なヒントまたは変数設定のみに依存する
例:
-- Q3:グローバルにDOP=8を指定し、すべてのテーブルでこの値を使用する
SELECT /*+PARALLEL(8)*/ *
FROM t1, t2
WHERE t1.c1 = t2.c1;
-- Q4:グローバルにAuto DOPポリシーを有効にし、すべてのテーブルでアルゴリズムに基づいてDOPを自動計算する
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;
-- t1はDOP=8を使用し、t2はグローバルで指定されたDOP=4を使用する
-- Q6:テーブルレベルのヒントとAuto DOPポリシーの組み合わせ
SELECT /*+PARALLEL(t1 8) PARALLEL(AUTO)*/ *
FROM t1, t2
WHERE t1.c1 = t2.c1;
-- t1はDOP=8を使用し、t2はAuto DOPポリシーに基づいてDOPを自動計算する
システム変数によるDOPの設定
ポリシー設定
parallel_degree_policy システム変数(グローバル GLOBALまたはセッション SESSIONレベル)を使用して、Auto DOPポリシーを有効にします:
/* グローバルレベルでAuto DOPを有効化 */
SET global parallel_degree_policy = AUTO;
/* セッションレベルでAuto DOPを有効化 */
SET session parallel_degree_policy = AUTO;
SET parallel_degree_policy = AUTO;
/* グローバルレベルでAuto DOPを無効化 */
SET global parallel_degree_policy = MANUAL;
/* セッションレベルでAuto DOPを無効化 */
SET session parallel_degree_policy = MANUAL;
SET parallel_degree_policy = MANUAL;
有効化後、テーブルオブジェクトのDOPは自動的に計算されます。詳細なルールについては、Auto DOPポリシーの有効化を参照してください。
固定DOP設定
以下の内部変数を使用すると、クエリまたはDMLの並列度を強制的に設定できますが、条件を満たす必要があります:
- グローバル
PARALLELヒントでDOPが指定されていないこと。 - Auto DOPポリシーが有効になっていないこと(つまり、
parallel_degree_policyが有効になっていないこと)。
SET _enable_parallel_query = 1; -- クエリの並列処理を有効化
SET _enable_parallel_dml = 1; -- DMLの並列処理を有効化
SET _force_parallel_query_dop = 8; -- クエリのDOPを固定
SET _force_parallel_dml_dop = 8; -- DMLのDOPを固定
スキーマDOP
固定DOPポリシーを使用する場合、システム変数で並列処理を有効にし、かつ DOP = 1 を設定すると、クエリはテーブル作成時に指定されたDOPを使用します:
-- 並列処理を有効にするが、DOPを1に強制
SET _enable_parallel_query = 1;
SET _enable_parallel_dml = 1;
SET _force_parallel_query_dop = 1;
SET _force_parallel_dml_dop = 1;
その後、クエリは ALTER の後のDOP値に基づいて並列処理を実行します(例えば、テーブル t1 はDOP=4、インデックス idx1 はDOP=2を使用します)。
例:
-- テーブルレベルのDOP設定例
CREATE TABLE t1(c1 INT, c2 INT, c3 INT) PARALLEL 8;
CREATE INDEX idx1 ON t1(c1);
-- その後、テーブルとインデックスのDOPを調整可能
ALTER TABLE t1 PARALLEL 4;
ALTER INDEX idx1 PARALLEL 2;