この章では、分散実行と並列クエリについて説明します。
分散実行
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を再度分割し、スキャンタスクをより均等に配分することができます。