オラクルのインメモリを3つのポイントから理解する


Oracle Database 12cは、データベースの新しい技術として注目されているインメモリとカラム型データベースをオプション機能「Oracle Database In-Memory」で提供しています。

データをカラム(列)型フォーマットでメモリーに載せることで、分析系のクエリーが高速化します。また、従来のロー(行)型フォーマットも同時に使用することで、分析処理とトランザクション処理の両方のパフォーマンスを高い次元で実現しています。

今回は以下の3つのポイントに沿って、Oracle Database In-Memoryが、分析系とトランザクション系の双方で高いパフォーマンスを発揮する理由について説明しましょう。

  ① ロー型フォーマットとカラム型フォーマットの両立を実現
  ② 運用管理性と高速性の高度な両立
  ③ スケールアウトによる可用性と拡張性


ロー型フォーマットとカラム型フォーマットの両立を実現


データベースでは、これまでデータを行ごとに格納するロー型フォーマットが使われてきました。データの追加、更新といったトランザクションにおいて、行ごとにデータを書き換えることに有効なフォーマットです。

しかし最近では、カラム型フォーマットが登場してきました。OLTP処理を得意とするロー型に比べ、カラム型は集計や分析処理などのクエリー処理が高速になるという利点をもち、ビッグデータなどの分析系処理では、その活用がトレンドの1つとなっています。

オラクルのOracle Database In-Memoryは、ロー型とカラム型の2つのフォーマットを同時にメモリー上にロードして利用可能です。

Oracle Database In-Memoryは、この2つのフォーマットに対応し、それぞれをメモリー上にロードして同時に利用可能とすることで、より高速なデータベースを実現しました。

Oracle Database In-Memoryのアーキテクチャは、従来のオラクル・データベースの構造を変えることなく、メモリー上に新しいデータ・フォーマットを導入したものです。よって、従来のオラクル・データベースの機能をすべて活用でき、アプリケーションの変更も必要ありません。

メモリー上のロー型とカラム型のフォーマットは、1つのディスク・フォーマットから同時生成されます。ロー型は、実は従来のバッファ・キャッシュそのものを活用しています。これに加え、カラム型のデータをメモリー上に展開できるようにしました。

オラクルのインメモリの特長は、この両方のフォーマットをアプリケーションから利用可能なことです。アプリケーションからのリクエストをオプティマイザーが自動判別し、集計・レポート処理はカラム型に対して実行、OLTP処理はロー型に対して実行します。このように、アプリケ-ションはOracle Database In-Memoryの性能を、ロー型・カラム型を意識することなく利用できるのです。

ところで、ロー型フォーマットとカラム型フォーマットはリアルタイムに同期することで、常に整合性が保たれています。バッファ・キャッシュが更新されると、カラム型フォーマットも同時に更新されます。更新された情報はすぐにカラム型フォーマットに反映されるため、検索系の処理はアップデートされた最新のデータにアクセスできます。

一般的なインメモリの仕組みでは、ロー型とカラム型のどちらか一方を選択して利用します。オラクルのOracle Database In-Memoryオプションでは、アプリケーションはロー型とカラム型の2つのフォーマットにアクセス可能。さらには、効果が出るテーブルやパーティンションのみを選択し、メモリー上に載せて利用することも可能です。


運用管理性と高速性の高度な両立


前述のとおり、Oracle Database In-Memoryはオラクルのアーキテクチャを変えることなく、SGA(System Global Area)内の新たな領域として、メモリー領域を確保しました。このメモリー領域に、カラム型フォーマットのデータがポピュレート(ロード)されます。データのポピュレートはバックグラウンド・プロセスで実行されるため、ポピュレート中でもアプリケーションはデータにアクセス可能です。

ポピュレートのプロセス数はパラメータで設定できます。ポピュレート時では、データをメモリーに格納するのと同時にデータ圧縮も行います。データ圧縮率はデータのアクセス特性に応じて調整が可能。また、ポピュレートの最中においてもアプリケーションからのデータ・アクセスは可能です。

全てのテーブルをメモリーに乗せる必要はなく、ユーザーが任意に選択することができます。また、パーティション、サブ・パーティション単位でも選択でき、マテリアライズド・ビューをメモリーに乗せる対象にすることもできます。参照頻度が高いデータをメモリー上に載せるほど、データベースは高速化できます。アプリケーションとテーブルの内容を熟知していれば、ピンポイントでメモリー上に何を載せるかを選択できそうですが、内容を熟知するのが難しいことも多いです。そこで、オラクルはアドバイザーの提供を予定しています。これはスクリプトの形態で提供され、効果が出そうなデータをランキング表示するものです(近日提供予定)。

オラクルのインメモリデータベースは、多くのインメモリ実装がすべてのデータをメモリー上に展開するのに対し、高速化したいデータのみをメモリー上に展開します。そのため、コスト効率の高いメモリー利用が可能です。

Oracle Database In-Memoryでは、実はOLTP処理の高速化も可能になります。ロー型とカラム型のデータの整合性をリアルタイムに維持するという作業を行っているにもかかわらず、なぜ高速化できるかを説明しましょう。

インデックスの数が多くなるほど、テーブルにデータを追加した際のインデックスに対する更新コストが増大します。そのため、インデックスの付け方は、これまでデータベース管理者の腕の見せ所でもありました。通常、OLTPで必要なインデックスだけではなく、集計や分析用のインデックスも多く作成され、これがOLTP処理を遅くする要因でした。しかし、Oracle Database In-Memoryオプションにより、このインデックスを無くし、メモリー上のカラム型ストアに置き換えてしまうことで、パフォーマンスの向上が可能になります。もはやデータベース管理者はインデックスに悩む必要がなくなり、OLTPと分析系の双方の処理が高速化できます。

インデックスをなくしてしまい、メモリー上のカラムストアに置き換えてしまう。すると、テーブルにデータを追加しても1つから3つ程度のインデックスのアップデートで済みます。カラム型ストアはメモリー上にあるため、更新のオーバーヘッドはほとんどなく、データベースの高速化に寄与します。

ところで、Oracle Database In-Memoryの性能を支える技術がいくつかあります。その1つがSIMD(Single Instruction Multiple Data)です。SIMDは、1回のCPU命令で複数の処理を実行する機能です。カラム型フォーマットではこの機能をより有効的に利用できるため、高速な、データのスキャンが可能になり、1コアあたり数10億行/秒の処理能力を実現します。また、複数テーブルのジョインでもSIMDを使用して高速化を実現しています。

もう1つの技術が、カラム・ストア・ストレージ・インデックスです。カラム型フォーマットでは、インメモリ・コンプレッション・ユニット(IMCU)と呼ばれる、ある程度のサイズの塊で管理されています。この塊ごとに列データの最大値と最小値を持っているため、無駄なメモリー・アクセスをすることなく、効率的にデータにアクセスできるのです。

ここまでの説明でお分かりのように、インメモリデータベース の高速性は、どのデータをメモリー上に配置して運用するかにかかってきます。オラクルはそのためのツールも用意しています。インメモリの利用状況はEnterprise Managerから監視できます。インメモリを視覚的に把握しながら、性能の向上を図ることが可能です。

Enterprise Managerから、頻繁にアクセスしている領域など、インメモリの利用状況を視覚的に確認できるため、運用しながらより効果的なインメモリ活用を行うことができます。


スケールアウトによる可用性と拡張性


OLTP高速化のための拡張のアプローチとしてスケールアップとスケールアウトがありますが、高速化と可用性の両方を満たすにはRAC(Real Application Cluster)を使ったスケールアウトが有効です。データを別ノードに複製する複製配置による可用性向上、大規模データを複数ノードに分散し並列処理を可能にすることによる高速化を行うことができ、スケーラブルで可用性の高い、並列分散処理基盤を構築できます。

In-Memory Parallels Queryと組み合わせて、高速なインメモリ並列処理が可能。各ノードのCPUを最大限に活用し、高速化と障害時の可用性担保の両方を実現できます。

以上3つのポイントに沿ってオラクルのインメモリデータベースについて説明してきました。Oracle Database In-Memoryが、「リアルタイム分析の高速化」と、「OLTPの高速化」をどう実現しているかがご理解いただけたと思います。

ところでOracle Database In-Memoryが既存のアプリケーションを変更することなく利用できることはすでに説明しましたが、「導入のステップ」は非常にシンプルです。(1)メモリサイズの設定、(2)メモリー上に展開するテーブル、パーティションの選択、(3)インデックスの削除の3点のみです。

既存資産は完全に保護されます。留意点としては、インメモリ化によってどれくらい高速化されるかの事前調査が重要です。

Oracle Database In-Memoryを充分に生かすには、導入前の事前調査と、メモリー管理が重要となります。これらを行えば、アプリケーションの変更やデータの移行をすることなく、既存の資産をそのまま保護/継承してデータベースを高速化できるのが、Oracle Database In-Memoryです。