はじめに
第3回は大量のデータにアクセスする場合に範囲を限定するデータ構造であるパーティショニングについて見ました。今回は分析や集計処理などの大量のデータにアクセスする処理でよく使用される並列実行(パラレル実行、Parallel Execution、Parallel Processing)について解説します。並列実行はパーティショニングと強い関係があります。
なお、本連載で例として挙げるデータベースはオラクルが提供しているものが多いですが、オラクル製品を使っていない方にも参考にしていただけるように解説していきます。
対象読者
この連載では以下の読者を想定しています。
- データ資産を活用する、新しいアプリケーションの構想や設計を担われる方
- データ基盤の運用を担われている方や、今後検討される方
- 新たに開発するアプリケーションの、最適なデータベースをお探しの方
- 目的別データベースから、価値ある情報を素早く引き出す検討をされている方
並列実行とは
トランザクション系のシステムが生成した何千万件や何十億件ものデータは、後で集計や分析にかけられます。つまり1つの集計・分析処理が大量のデータにアクセスするということが発生します。このような処理は一般的に時間がかかるため、短時間で実行するためによく使用される実装が、第3回で説明したデータのアクセス範囲を限定するパーティショニングと、今回の並列実行の組み合わせです。
データベース・サーバーは一般的に複数のCPUコアやストレージ・デバイスから構成されています。並列実行の狙いは、処理すべきデータが大量にある場合、これらを分割して複数のCPUコアに割り当て、同時に実行することで全体の処理時間の短縮を期待するものです。最近のCPUは1ソケット当たり数十コアを搭載しており、1台のサーバーでも並列実行による処理時間の大幅な短縮が期待できます。
![並列実行](http://cz-cdn.shoeisha.jp/static/images/article/14931/14931_001.png)
並列実行をシステムに実装する原始的な手段としては、人が処理対象のデータを範囲分割し、複数の処理プログラムに投入するという方法がとられることもあります。しかし多くのDBMSは1つのSQLの処理を自動並列化する機能を持っています。今回はこの1つの処理を自動並列化する実装を見ていきます。
並列実行のプロセス・アーキテクチャ
並列実行される場合、DBMSのOSプロセスまたはスレッドが複数起動され、これらが複数のCPUスレッドに割り当てられることで同時に処理を行います。複数プロセスによって分担された処理結果は1つのデータベース・クライアントに送り返さないといけないので、1つのプロセスに処理結果を集約し、この1つのプロセスがデータベース・クライアントに送り返します。データベース・クライアントが接続しているプロセスが並列実行の処理を統括しており、一般的にコーディネーター・プロセスと呼ばれます。
Oracle Databaseの場合、データベース・クライアントがOracleサーバーに接続するとそのコネクションは1つのOracleサーバー・プロセスに接続しています。並列実行される場合はこのOracleサーバー・プロセスがコーディネーター・プロセスの役割を担います。
![並列実行のプロセス・アーキテクチャ](http://cz-cdn.shoeisha.jp/static/images/article/14931/14931_002.png)
複数ある並列実行プロセスに処理データを分担させるわけですが、ここでパーティショニングの考え方が出てきます。データの分割と割り当て方法が適切でないと、各並列実行プロセスの処理時間が不均一になってしまいます。また、並列実行プロセス間でデータ交換能力がないと、不適切なデータ分割によっては各並列実行プロセスが返してきた結果をコーディネーター・プロセスが結合する処理が増える、つまり並列化できない部分が増えることになります。