パラレルクエリ(パラレルクエリ)の概要
データ量の急速な増加に伴い、クエリパフォーマンスとリソース利用率の最適化は、データベース管理における重要な目標となっています。並列度(DOP、Degree of Parallelism) は、パラレル実行能力を測定する重要な指標であり、クエリ応答時間とシステムスループットを大幅に改善することができます。
パラレルクエリは、複数の処理ユニットで同時にタスクを実行することで、SQLクエリの効率を向上させます。そのコア思想は、クエリプランの最適化に基づいて、システムの計算リソースとI/O能力を最大限に活用することで、単一クエリの処理を高速化させるというものです。
パラレルクエリの特徴
OLTPとOLAPの違い
SQLクエリのタイプによって、以下のようにパラレル処理における特性が異なります:
- OLTP (オンライントランザクション処理):通常、大量の短いトランザクションを扱うため、1回のクエリで取得するデータ量は少なく、並列度の必要性は限定的です。むしろ、トランザクションの迅速な応答能力に依存します。
- OLAP (オンライン分析処理):大規模なデータ分析タスクに適しており、膨大なデータセットを処理し、パラレルクエリへの依存度が高いことから、並列度によりクエリのスループットと効率を向上させる必要があります。
クエリ分解と演算子並列
パラレルクエリにおいて、クエリは複数の 演算子(Operator) に分解され、段階ごとにパラレル処理が実行されます。これには以下の内容が含まれます:
- データ読み取り:データを並列スキャンします。
- 計算実行:複数の処理ユニットが同時に計算に参加することで、集約やソートなどの複雑な操作を高速化します。
- 結果出力:データのマージンとリターンを最適化する。
パラレルクエリ最適化戦略
分散クエリプランの生成
分散実行は、パラレルクエリにとって重要な構成要素です。OceanBaseデータベースにおいて、分散クエリプランの生成はクエリ実行時の効率性に大きく影響します。データの分布、演算子の依存関係、リソースの使用状況を分析することで、システムが効率的な実行計画を構築できるようになります。
詳細な原理については、以下を参照してください:分散計画の生成
並列度(DOP)の調整
クエリの複雑さとデータ量に応じて並列度を適切に調整することは、以下のように、クエリパフォーマンスを最適化する上で重要です:
- 並列度が低すぎる場合:システムリソースを十分に活用できないため、クエリ時間が長くなります。
- 並列度が高すぎる場合:リソース競合が発生し、システムのスループットが低下する可能性があります。
クエリ実行計画をモニタリングし、実行時間とリソース使用状況を分析することで、並列度を正確に調整し、最適なバランスを実現することができます。
並列度を調整するには?
クエリを高速化し、ビジネスニーズを満たすために、通常、パラレル実行によりクエリ時間を最適化します。それでは、並列リソースはいくつあればいいですか?オプティマイザーでは、並列リソースの量は並列度(DOP:Degree of Parallel)で表され、実際のビジネスシナリオでは、並列化を有効にするかどうか、および並列度の高さは、実際のクエリの実行状況とビジネスニーズに基づいて経験的に判断されます。
OceanBaseデータベースは、並列度を手動と自動の2つの方法で設定することができます。
オプティマイザーの並列度を手動で選択
並列度を手動で設定することができます。詳細については、パラレル実行時の並列度を設定するを参照してください。
オプティマイザーの並列度を自動で選択
Auto DOP
手動で並列度を指定する場合は、システム変数を使用して、現在のセッション内のすべてのクエリの実行について並列化を有効にするとともに、並列度を指定することができます。ただし、これはセッション内で並列化による高速化が不要であるか、または高いDOPを使用する必要のないクエリに対して、パラレル実行によるオーバーヘッドを発生させ、パフォーマンスの低下につながる可能性があります。一方、ヒントを用いて特定のクエリの並列度を指定することもできますが、これは個々のビジネスクエリに対して個別に検討する必要があり、大量のビジネスクエリが存在する状況下では現実的ではありません。
手動で並列度を指定することによる不便さと制約を解消するために、クエリオプティマイザーでは、Auto DOP機能により、クエリプランを生成する際にクエリの実行に要する時間を評価し、並列化を有効にするかどうかと、有効にする場合の適切な並列度を自動的に決定することができます。これにより、手動で並列度を指定することによるパフォーマンスの低下を防ぐことができます。
注意
- Auto DOPを有効にした後、
parallel_min_scan_time_thresholdとparallel_degree_limitの2つの関連するパラメータの設定に注意する必要があります。これが正しくない場合、Auto DOPがAPシステムに悪影響を及ぼす可能性があります。
- Auto DOPは、評価されたクエリ実行オーバーヘッドのみに基づき、RTを低減することを目的として、並列化の有効化とDOPの計算の意思決定を行います。ビジネスワークロード内に、ユーザーの関心が低い低速クエリが存在する場合は、リソース分離手段を使って処理する必要があります。これを行わずにAuto DOPを有効にすると、すべてのクエリに対してAuto DOPで指定された並列度が使用され、システムに悪影響を及ぼします。
Auto DOPの有効化
現在、オプティマイザーのDOP選択戦略にはAUTOモードとMANUALモードの2つがあります。AUTOモードでは、オプティマイザーはクエリの実際の状況に基づいて、並列化の有効化と並列度の決定を自動で行うことができます。MANUALモードは、手動で行うことで並列化を有効にすることができます。
オプティマイザーのDOP選択戦略には2つの制御方法があります。システム変数parallel_degree_policyを使用して、グローバルまたはsessionレベルのDOP選択戦略を設定することができます。また、より優先順位の高い ヒントを使用して、クエリレベルのDOP選択戦略を設定することもできます。
注意
パラメータタイプはシステム変数であり、グローバルレベルで変数を変更した場合、新規接続の場合のみ有効となります。既存の接続については切断する必要があります。
-- グローバルレベルでAuto DOPを有効にする
set global parallel_degree_policy = AUTO;
-- sessionレベルでAuto DOPを有効にする
set session parallel_degree_policy = AUTO;
set parallel_degree_policy = AUTO;
-- グローバルレベルでAuto DOPを無効にする
set global parallel_degree_policy = MANUAL;
-- sessionレベルでAuto DOPを無効にする
set session parallel_degree_policy = MANUAL;
set parallel_degree_policy = MANUAL;
ヒントはシステム変数よりも優先順位が高く、クエリレベルでAuto DOPのオン/オフ制御を行うことができます。
-- ヒントを使用し、クエリレベルでAuto DOPを有効にする
select /*+parallel(auto)*/ * from t1;
-- ヒントを使用し、クエリレベルでAuto DOPを無効にする
select /*+parallel(manual)*/ * from t1;
select /*+parallel(8)*/ * from t1;
関連パラメータの設定
Auto DOPによりDOPの計算を行う場合、最終的に指定されるDOPの大きさは、以下の2つのシステム変数の影響を受けます。デプロイリソースとビジネスワークロードが異なる条件下でも、これら2つのパラメータを調整することで、Auto DOPの動作に介入することができます。
注意
パラメータタイプはシステム変数であり、グローバルレベルで変数を変更した場合、新規接続の場合のみ有効となります。既存の接続については切断する必要があります。
parallel_min_scan_time_threshold:ベーステーブルスキャンを並列化するためのしきい値を設定するために使用されます。このしきい値は、クエリを並列化するかどうかと、DOPの大きさに影響します。パラメータの単位はms、デフォルト値は1000、最小値は10です。
使用シナリオ:
パラメータのサイズを調整することで、APシステム内で実行されるパラレルクエリの数と使用時の並列度を制御します。Auto DOPを有効にした後、一部の関心のあるクエリの並列化が有効になっていない場合、または並列度が低く、並列度の上限に達していない場合は、parallel_min_scan_time_threshold の設定値を小さくすることで、より多くのクエリの並列化が有効になり、既に並列化が有効なクエリについても、さらに高い並列度を使用するようになる場合があります。反対に、パラメータの設定値を大きくすることもできます。
Auto DOPを有効にした後、大量のクエリが高い並列度で並列化を有効にし、システムリソースを過剰に消費するのを防ぐために、パラメータのデフォルト値は保守的に設定されています。Auto DOPを有効にする場合は、通常、システムのワークロード状況を評価した上で、パラメータを適切な値に調整する必要があります。
例:
-- 現在のsession内でのベーステーブルスキャンにおける並列有効化の評価コストしきい値を10msに設定します。
set parallel_min_scan_time_threshold = 10;
-- グローバルでのベーステーブルスキャンにおける並列有効化の評価コストしきい値を10msに設定します。
set global parallel_min_scan_time_threshold = 10;
explain select /*+parallel(auto)*/ * from t1;
-- パラメータを20に設定し、最終的なDOPを4とし、並列化を有効にする場合、ベーステーブルスキャンにおける評価コストは12 msとなります
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とし、並列化を有効にする場合、ベーステーブルスキャンにおける評価コストは8 msとなります
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:Auto DOPの使用後に使用可能な最大DOPを制限するために使用されます。デフォルト値は0であり、オプティマイザーは、テナントのCPUとシステム変数parallel_servers_targetに基づいて最大DOPを制限します。
使用シナリオ:
APシステム内でAuto DOPを有効にした後で、高い並列度を必要とするクエリが多数発生し、システムワークロードが上昇した場合は、parallel_degree_limitを設定することで、許可される最大DOPをさらに制限することができます。この場合、必要に応じて parallel_degree_limit をCPUの値より小さい値に設定します。
システム内で単一のAPクエリのみを実行する場合は、parallel_degree_limit をデフォルト値とし、クエリは最大でCPU数の並列度を使用することができます。Auto DOPにおいて、より高い並列度が必要な場合は、parallel_degree_limit をCPU数よりも大きい値に設定することで、CPU数によるDOPの制限を解除することができます。なお、この調整は、単一のAPクエリのパフォーマンスを極限まで最適化する場合にのみ使用可能です。本番環境での使用は禁止されています。
例:
-- 現在のsessionでのAuto DOPによって指定する最大並列度を8に設定する
set parallel_degree_limit = 8;
-- グローバルでのAuto DOPによって指定する最大並列度を8に設定する
set global parallel_degree_limit = 8;
Auto DOPの詳細については、Auto DOPを参照してください。
パラレル実行
パラレル実行(Parallel Execution)は、大きなタスクを複数の小さなタスクに分割し、複数のスレッドまたはプロセスを起動してそれらの小さなタスクをパラレル処理することで、より多くのCPUとI/Oリソースを活用し、操作の応答時間を短縮する手法です。
パラレル実行は、パラレルクエリ(Parallel Query)、並列DDL (Parallel DDL)、並列DML (Parallel DML)に分けられます。
パラレル実行を起動する方法には、以下の2種類があります:
- 手動で並列度(DOP)を指定するか、Auto DOPを使用してパラレル実行を起動する。
- クエリ対象のパーティション数が1を超えるパーティションテーブルに対しては、パラレルクエリが自動的に起動します。
詳細については、パラレルクエリの実行を参照してください。