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ミリ秒
上記の設定は、システムレベルでクエリ性能とリソース割り当てのバランスを取り、データベース全体の応答性と安定性を最適化するのに役立ちます。