この章では、分散実行と並列クエリについて説明します。
分散実行
Shared-Nothing型の分散システムでは、リレーショナルデータテーブルのデータはパーティション単位でシステム内の各ノードに格納されます。そのため、パーティションをまたがるデータクエリリクエストでは、実行計画が複数のノードのデータを操作できる必要があります。これにより、OceanBaseデータベースは分散実行計画の生成と実行機能を備えています。
分散実行計画において、パーティショニングはクエリ性能を向上させます。データベースのリレーショナルテーブルが比較的小さい場合は、パーティショニングは不要です。リレーショナルテーブルが大きい場合は、上位ビジネス要件に基づいて慎重にパーティションキーを選択し、ほとんどのクエリがパーティションキーによるパーティションプルーニングを利用できるようにすることで、データアクセス量を削減する必要があります。
同時に、関連性のあるテーブルについては、関連キーをパーティションキーとして使用し、同一のパーティショニング方式を採用することを推奨します。また、Table Groupを使用して同一のパーティションを同じノードに配置することで、ノード間のデータ通信を削減できます。
OceanBaseデータベースのオプティマイザーは、クエリとデータの物理的な分散状況に基づいて、自動的に分散実行計画を生成します。
並列クエリ
並列クエリとは、クエリ計画を変換することで、各クエリ計画のCPUおよびI/O処理能力を向上させ、単一クエリの応答時間を短縮する技術です。並列クエリ技術は、分散実行計画にもローカルクエリ計画にも適用できます。
単一クエリのアクセスデータが同一ノード上にない場合、関連データを同一ノードに再配置するデータ再分散を通じて、計算を実行する必要があります。データ再分散のノードを上下の境界として、OceanBaseデータベースの実行計画は垂直方向に複数のDFO(Data Flow Operation)に分割されます。各DFOは指定された並列度のタスクに分割され、並列実行によって実行効率が向上します。
一般的に、並列度が高くなると、クエリの応答時間は短縮され、より多くのCPU、I/O、メモリリソースがクエリコマンドの実行に使用されます。大量データクエリ処理をサポートするDSS(Decision Support Systems)システムやデータウェアハウス型アプリケーションでは、クエリ時間の向上が特に顕著です。
全体として、並列クエリの基本的な考え方は分散実行計画と類似しています。すなわち、実行計画を分解した後、実行計画の各部分を複数の実行スレッドが実行し、一定のスケジューリング手法によって、実行計画内のDFO間およびDFO内部での並列実行を実現します。
システムが以下の条件を満たす場合、並列クエリはシステム処理性能を効果的に向上させることができます:
十分なI/O帯域幅
システムのCPU負荷が低いこと
十分なメモリリソース
システムが追加の並列処理を行うための十分なリソースを持たない場合、並列クエリを使用したり並列度を高めたりしても、実行性能は向上しません。逆に、システムが過負荷の場合、オペレーティングシステムは実行コンテキストスイッチングやページ交換など、より多くのスケジューリングを強いられる可能性があり、性能が低下する可能性があります。
通常、DSSシステムでは、多数のパーティションへのアクセスやデータウェアハウス環境が必要とされます。このような場合、並列実行は実行応答時間を向上させることができます。単純なDML操作やパーティション内クエリ、および関与するパーティション数が少ないクエリについては、並列クエリを使用してもクエリ応答時間を顕著に短縮することはできません。
並列実行の適応型タスク
Granule(粒度単位)は、データスキャンの最小並列作業単位です:
- 各Granuleは連続したデータスキャンタスク範囲を記述し、厳密に単一のテーブルパーティション内部に限定されます。
- パーティションデータを複数のGranuleに分割することで、複数の並列スレッドが異なるGranuleを同時に処理できます。
oceanbaseデータベースは、並列実行(PX)タスクのリバランシング機能をサポートしており、残りのGranule数がPXスレッド数より少ないことを検出すると、残りのGranuleを再度分割してスキャンタスクをより均等に配分します。