並列実行の適用
データベースでの並列実行は主に集計・分析処理で使用される実装です。トランザクション系システムで生成されたデータをそのまま集計に用いることもありますが、スキーマ構造を分析処理に適した形(データ・ウェアハウスと呼ぶこともあります)に変換してから分析をかけることもあります。
一般的に、トランザクション系のスキーマは正規化されています。そのためトランザクション系で生成された大量のデータを分析するには大量のジョインが発生します。分析処理用にスキーマ構造を変換するというのは、あらかじめジョイン済みのデータを用意し、分析用SQLで発生するジョインが減るのを期待しています。
スキーマ構造の変換では、まずトランザクション系のデータベースからデータを抽出(Extract)し、ジョイン済みのデータに変換(Transform)し、これを分析用データベースに格納(Load)します。このような一連の変換処理をExtract-Transform-Loadの頭文字をとってETL処理と呼びます。ETL処理にジョインを肩代わりさせることで、分析用SQLのジョインを減らすことはできますが、システムのどこかでやはり大量データのジョインを高速に実行する機能が必要といえます。
Oracle Databaseはパーティション表か非パーティション表かを問わずに高速に並列ジョインする能力があります。そのため、Oracle Databaseを対象としたETLツールであるOracle Data IntegratorはETLのフローを設計した後、それをデータベースと別のETL処理用サーバーに実行させるのではなく、Oracle Databaseそのもので実行します。このように、DBMSの並列実行能力によってシステム全体のアーキテクチャに新しい選択肢が得られます。
まとめ
今回は大量のデータにアクセスする場合に複数のCPUに処理を分担させて処理時間を短縮する並列実行について解説しました。
大量のデータを複数の並列実行プロセスに分担させることはパーティショニングの考え方そのものです。パーティショニング方式が不適切だと複数ある並列実行プロセスごとの処理時間に偏りが発生し、処理時間の短縮が期待できません。そのため、アクセス範囲を限定することと並列実行プロセス間の処理時間を均一化することの両方を満たすパーティショニングが可能であることが必要であり、また、並列実行プロセス同士がデータ交換能力を持っていることも並列実行の適用可能範囲を広げるために重要です。
並列実行というのは単に並列度を上げればよいというものではなく、まずアルゴリズムの力で演算量を減らすことのほうが重要です。ハードウェアの物量を10倍にして並列度を10倍にしても処理時間はせいぜい1/10にしかなりませんが、アルゴリズムの力は同じハードウェアの物量で処理時間を1/10やそれ以下にしてしまいます。大量データの処理にはアクセス範囲の限定と並列実行の組み合わせが効果的です。
次回は並列実行を複数のサーバー・ノードに拡張するクラスタ構成について扱う予定です。