Auto DOPとは
OceanBaseデータベースのオプティマイザーにおける並列度DOP(Degree of Parallel)の選択戦略は、現在AUTOモードとMANUALモードに分かれています。AUTOモードを選択することがAuto DOPです。
なぜ AUTO DOP を選択するのか?
MANUAL モードでは、手動で並列度を指定できます。一つの方法はシステム変数を使用して、現在のセッション内のすべての実行クエリに対して並列実行を有効にし、並列度を指定することです。しかし、これにより、並列高速化が不要である、または高い DOP を使用する必要がないクエリにも余分な並列実行のオーバヘッドが発生し、パフォーマンスが低下する可能性があります。もう一つの方法はヒントを使用して特定のクエリの並列度を指定することですが、これには各業務クエリについて個別に検討する必要があり、業務クエリが多数存在するシナリオでは実行不可能です。
手動で並列度を指定することに伴う不便さと制限に基づき、AUTO モードのオプティマイザーは、クエリの実際の状況に応じて、並列実行を自動的に有効にし、並列度を決定できます。
OceanBase データベースのクエリオプティマイザーの Auto DOP 機能は、クエリ計画を生成する際にクエリの実行時間を評価し、並列を有効にするかどうか、および現在のクエリに適した並列度を自動的に判断します。これにより、手動で並列度を指定することによって生じるパフォーマンス低下の問題を回避できます。
Auto DOPポリシーを有効にする方法は何ですか?
OceanBaseデータベースのオプティマイザーは、システム変数parallel_degree_policyを使用してGLOBALおよびSESSIONレベルでAuto DOPの選択ポリシーを設定できます。また、より高い優先順位を持つHintを使用してクエリレベルでのDOP選択ポリシーを設定することもできます。設定方法は以下の通りです:
/* GLOBALレベルでAuto DOPを有効にする */
SET global parallel_degree_policy = AUTO;
/* SESSIONレベルでAuto DOPを有効にする */
SET session parallel_degree_policy = AUTO;
SET parallel_degree_policy = AUTO;
/* GLOBALレベルでAuto DOPを無効にする */
SET global parallel_degree_policy = MANUAL;
/* SESSIONレベルでAuto DOPを無効にする */
SET session parallel_degree_policy = MANUAL;
SET parallel_degree_policy = MANUAL;
/* Hintを使用してクエリレベルでAuto DOPを有効にする */
SELECT /*+PARALLEL(AUTO)*/ * FROM ...;
/* Hintを使用してクエリレベルでAuto DOPを無効にする */
SELECT /*+PARALLEL(MANUAL)*/ * FROM ...;
SELECT /*+PARALLEL(8)*/ * FROM ...;
Auto DOPとその他の並列実行の関係
並列実行を有効にする複数の方法における優先順位の詳細については、並列実行の方法と優先順位を参照してください。
Auto DOPを有効にすると、オプティマイザーはSELECT/DELETE/UPDATE/INSERTなど、さまざまな操作で並列処理を有効にできます。DELETE/UPDATE/INSERTなどのデータ操作では、並列処理を有効にするとPDMLが自動的に使用されるため、_enable_parallel_dmlを設定してPDMLを有効にする必要はありません。
Auto DOPを有効にする必要があるかどうかの判断方法
Auto DOP機能を有効にするには、システムの業務負荷タイプを評価し、関連するシステム変数を適切に設定する必要があります。そうでない場合、有効化すると逆効果となり、システムに大きなリスクをもたらす可能性があります。
Auto DOPは、クエリ実行コストのみに基づいて評価し、応答時間(RT)の短縮を目的として並列処理の有無を決定し、DOPを計算します。業務負荷にユーザーにとって重要でない低速クエリが含まれている場合、この機能を有効にすると、これらのクエリが並列方式で実行され、高い並列度を得る可能性があります。これらのクエリの並列実行はシステムの並列リソースを占有し、通常の並列処理や応答時間の最適化が必要な他のクエリに干渉します。これらのクエリが過剰なリソースを占有すると、システムのCPU負荷が急激に上昇し、通常の業務クエリに深刻な影響を与えます。このような場合は、業務負荷を評価し、適切なリソース分離戦略を用いて対処する必要があります。リソース分離の概要のリソース分離の紹介を参照し、その後でAuto DOP機能の使用を決定してください。
さらに、Auto DOPは現在のクエリ応答時間(RT)の目標にのみ最適化し、システム内に並列処理が必要な多数のクエリが存在するシナリオは考慮しません。したがって、実際の業務システムでAuto DOP機能を使用する際には、実際の最適化目標に基づいて関連するシステム変数を調整する必要があります。詳細については、以下のAuto DOPの使用シナリオに記載されているシナリオ1:クエリパフォーマンスの極限最適化およびシナリオ2:システムパフォーマンスの最適化を参照してください。
Auto DOP戦略におけるDOPの選択動作をどのように介入するか?
Auto DOP戦略では、2つの関連するシステム変数parallel_degree_limitとparallel_min_scan_time_thresholdの値が取得されるDOPサイズに影響します。異なるデプロイメントリソースとビジネス負荷の条件下では、要件に応じて調整が必要です。
parallel_min_scan_time_thresholdパラメータの設定
システム変数parallel_min_scan_time_thresholdは、Auto DOP戦略において並列度を計算するためのパラメータであり、ベーステーブルのスキャンで並列処理を開始するための参考実行時間を表します。ベーステーブルのスキャン評価実行時間がこの設定値を超えると、ベーステーブルのスキャンで並列処理を開始し、この設定値を用いて適切な並列度を計算します。変数のデフォルト値は1000(ミリ秒単位)に設定されており、最小値は10です。
parallel_min_scan_time_thresholdの値を小さくすると、並列スキャンの有効化条件を緩和し、評価実行時間が短いベーステーブルのスキャンでも並列処理を活用できるようになります。同時に、データ量が比較的一定のテーブルにおいて、より効率的な並列スキャンを実現できます。
Auto DOPを有効にすると、多数のクエリが高い並列度で実行され、システムリソースを大量に消費する可能性があることを考慮し、このパラメータはデフォルトで比較的慎重な設定が採用されています。そのため、Auto DOPを有効にする際には、システムの実際の負荷状況に応じて適切に調整し、クエリの効率を向上させるとともに、システムの安定性に影響を与えないようにする必要があります。例えば、parallel_min_scan_time_thresholdを20または10に調整することで、一部の単一テーブルスキャンクエリの並列度を4または6に引き上げ、クエリ性能を最適化できます。
設定例は以下の通りです:
/* GLOBALレベルのAuto DOP戦略のDOP最大値を設定 */
SET GLOBAL parallel_degree_limit = 64;
/* SESSIONレベルのAuto DOP戦略のDOP最大値を設定 */
SET SESSION parallel_degree_limit = 64;
SET parallel_degree_limit = 64;
/* GLOBALレベルのAuto DOP戦略のDOPを設定 */
SET GLOBAL parallel_min_scan_time_threshold = 100;
/* SESSIONレベルのAuto DOP戦略のDOPを設定 */
SET SESSION parallel_min_scan_time_threshold = 100;
SET parallel_min_scan_time_threshold = 100;
アプリケーションの例は以下の通りです:
explain select /*+parallel(auto)*/ * from t1;
-- パラメータを20に設定すると、最終的に使用されるDOPは4で、並列処理を有効にした後のベーステーブルスキャン評価コストは12msです
set parallel_min_scan_time_threshold = 20;
=========================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
---------------------------------------------------------
|0 |PX COORDINATOR | |512000 |619089 |
|1 |└─EXCHANGE OUT DISTR |:EX10000|512000 |230501 |
|2 | └─PX BLOCK ITERATOR| |512000 |12189 |
|3 | └─TABLE FULL SCAN|t1 |512000 |12189 |
=========================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
dop=4
-- パラメータを10に設定すると、最終的に使用されるDOPは6で、並列処理を有効にした後のベーステーブルスキャン評価コストは8msです
set parallel_min_scan_time_threshold = 10;
=========================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
---------------------------------------------------------
|0 |PX COORDINATOR | |512000 |542256 |
|1 |└─EXCHANGE OUT DISTR |:EX10000|512000 |153667 |
|2 | └─PX BLOCK ITERATOR| |512000 |8126 |
|3 | └─TABLE FULL SCAN|t1 |512000 |8126 |
=========================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
dop=6
parallel_degree_limitパラメータの設定
parallel_degree_limitシステム変数は、Auto DOPが使用できる最大並列度を制限するために使用されます。0に設定すると、自動取得された並列度に制限がかからなくなり、これがデフォルト値でもあります。デフォルトでは、オプティマイザーはテナントのCPUとシステム変数parallel_servers_targetに基づいて最大並列度を制限します。
システムでAuto DOPが有効になっている後、大きな並列度を必要とするクエリが多数発生し、システム負荷が高くなる場合、parallel_degree_limitを設定して許可される最大並列度をさらに制限できます。この場合、必要に応じてparallel_degree_limitを特定のCPU値より小さい値に設定できます。
parallel_min_scan_time_thresholdのセクションで説明したクエリ例では、parallel_degree_limitを4に、parallel_min_scan_time_thresholdを10に設定しても、クエリが使用できる最大並列度は依然として4に制限されます。
Auto DOPの適用シナリオ
Auto DOP機能により、オプティマイザーはクエリ操作に対して並列処理を積極的に有効化し、実行効率を向上させることができます。ただし、並列度の規模は特定のシステム変数によって制約されるため、異なる使用シナリオではこれらのパラメータを細かく調整してパフォーマンスを最適化する必要があります。
シナリオ1:クエリ性能の極限的な最適化
データベースの負荷が低く、他の顕著なクエリ圧力がない場合、テナントで利用可能なすべての並列リソースを活用して最適なクエリ性能を実現したい場合は、Auto DOPの参照実行時間しきい値を最低に設定し、最大DOPを制限しないことを推奨します。対応するパラメータ設定は以下のとおりです:
ALTER SYSTEM SET parallel_degree_policy = AUTO;
ALTER SYSTEM SET parallel_degree_limit = 0; -- 最大DOPを制限しないことを表す
ALTER SYSTEM SET parallel_min_scan_time_threshold = 10; -- 10ミリ秒
この設定により、オプティマイザーは十分に低い実行時間しきい値で並列処理を有効化し、可能な限り最大DOPを使用してクエリを高速化します。
シナリオ2:システム全体の性能最適化
データベースの同時クエリ負荷が高い場合、多数のクエリが高いDOPを使用すると、システムの並列リソースが不足し、クエリキューの待機などの問題が発生する可能性があります。大量の高並列度クエリによるシステムリソースの占有を避けるために、クエリメカニズムの性能最適化に関するパラメータを調整できます:
parallel_degree_limitの値をシステムのCPUコア数より小さい値に設定することで、Auto DOPが使用する最大DOPを制限します。parallel_min_scan_time_thresholdの値を増やして、並列実行のトリガー感度を下げ、並列リソースの使用率を削減します。
例えば、最大DOPを32に制限し、評価実行時間が20ミリ秒を超えるクエリに対してのみ並列処理を有効にする場合、パラメータ設定は以下のとおりです:
ALTER SYSTEM SET parallel_degree_policy = AUTO;
ALTER SYSTEM SET parallel_degree_limit = 32;
ALTER SYSTEM SET parallel_min_scan_time_threshold = 20; -- 20ミリ秒
上記の設定は、システムレベルでクエリ性能とリソース割り当てのバランスを取り、データベース全体の応答性と安定性を最適化するのに役立ちます。