Auto DOPとは
OceanBaseデータベースのオプティマイザーにおける並列度DOP(Degree of Parallelism)の選択戦略は、現在 AUTO モードと MANUAL モードに分かれています。AUTO モードを選択することがAuto DOPです。
なぜAuto DOPを選択するのか?
MANUAL モードでは、並列度を手動で指定できます。一つの方法はシステム変数を使用して、現在のセッション内のすべての実行クエリに対して並列実行を有効にし、並列度を指定することです。しかし、これにより、並列高速化が不要であったり、高いDOPを必要としないクエリに対しても余分な並列実行のオーバヘッドが発生し、パフォーマンスが低下する可能性があります。もう一つの方法はHintを使用して特定のクエリの並列度を指定することですが、これには各業務クエリについて個別に検討する必要があり、業務クエリが多数存在するシナリオでは実行不可能です。
手動で並列度を指定することに伴う不便さと制限に基づき、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とします。並列処理を有効にした後のベーステーブルスキャンの評価コストは12ミリ秒です
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ミリ秒
上記の構成は、システムレベルでクエリ性能とリソース配分のバランスを取り、全体的なデータベースの応答性と安定性を最適化するのに役立ちます。