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