現在地

Oracle Database In-Memory について

今号のTopicでは、このほどリリースされましたOracle Database 12.1.0.2 の新機能であるOracle Database In-Memory をご紹介します。本機能は指定したテーブルをインメモリ化することで、主に分析のための集計・レポーティングなど、列単位で行われる処理を高速化するための機能です。
本リリースの目玉となる機能のひとつとなりますので、是非ご一読ください。
*以下は、サポート契約締結中のお客様に2014年9月号として配信しているサポートレターより一部抜粋して掲載しています。

Oracle Database In-Memory について

Oracle Database 12.1.0.2 では OLTP の高速化を行いつつ、大量データの分析をよりリアルタイムで実現するため、Enterprise Edition のオプションとして Oracle Database In-Memory が実装されました。今回は本機能の概要と特徴、留意点などを紹介します。

前書き : OLTP と分析処理

Oracle Database に限らず、データベースではオンライン・トランザクション処理 (OLTP)によりデータを逐次追加・更新することが一般的です。一方、近頃では OLTP などによって蓄積されたデータを分析するニーズも高まっています。

OLTP はレコード (行) 単位の処理が主体となり、「一度に処理されるデータ量は比較的少ないが実行回数が多く、頻繁にデータの更新を伴う」といった傾向を持ちますが、分析はディメンション (列) 単位の処理が主体となり、「尺度となる列を中心とした大量のデータを一度に取得して集計を行うが、実行回数は少なく読み込み処理が主体」といった真逆の傾向を持ちます。

OLTP と分析に適したデータ構造もそれぞれ異なっており、OLTP には関係の正規化を行い、冗長性を排した構造が適していますが、分析処理においてはスター・スキーマと呼ばれる、分析対象となるデータを 1 つに集約したファクト表を、分析の尺度となるマスタ表たちが取り囲む構造が適しているとされています。

このため、OLTP と分析の両方に適したデータベースの実装は実現が難しく、要件によっていずれかの用途により適したデータ構造を採用するか、OLTP 用のデータベースと分析用のデータウェアハウスの両方を構築することが一般的なアプローチとなっていました。

Oracle Database In-Memory の概要

Oracle Database 12.1.0.2 では、OLTP に適したデータ構造を持ちつつ、分析系の処理を高速化するためのアプローチとして、Oracle Database In-Memory が実装されました。本機能は Enterprise Edition のオプション製品となっており、既存のデータベースの基盤を保持したまま、大量データ分析のパフォーマンスを向上させることを目的としています。

具体的には、指定したテーブルやパーティション上へのデータに対して、以下の手順でデータをインメモリ化して問い合わせに使用します。

  1. 指定されたオブジェクトをデータファイルからメモリ上に読み込む
  2. 読み込んだデータを列指向型のデータに自動的に変換する
  3. 変換された列指向データを SGA の専用の領域に展開する

インメモリ化のタイミングは、最初にクエリが発行される際に同時に行うか、クエリの発行とは無関係に、定期的にポーリングを行うようにするかを選択することが可能です。

この仕組みにより、既存のデータ構造を変更することなく、分析対象となるデータを列指向 (分析に適したデータ構造) の形式でメモリ上に格納することができます。

なお、読み込まれたデータがデータベース・バッファ・キャッシュ領域にキャッシングされる点については、従来のデータアクセスと変わりません。すなわち、SGA 上では、行指向で保持されているバッファ・キャッシュ、および列指向で保持されているインメモリ・データストアの両方で、二重にデータが展開されることとなります。また、インメモリ・データストア上に展開されたデータはバッファ・キャッシュと同期されており、データの更新が行われた場合もトランザクションの一貫性や、インメモリデータのリアルタイム性は維持されます。

インメモリ化するデータの単位としては、以下の形式が使用できます。

  • テーブル
  • パーティション
  • サブ・パーティション
  • マテリアライズド・ビュー

大規模な表のうち、頻繁にアクセスされる表の一部分のみをパーティションとして切り出し、インメモリ化することも可能です。

Oracle Database In-Memory の特徴と留意点

現在なんらかの形でインメモリ・データベース機能を備えているデータベース製品はOracle Database 以外にも多数ありますが、一般的なインメモリ・データベース機能と比べると、Oracle Database In-Memory では以下のような点が特徴となっています。

  1. 行指向 / 列指向のどちらか一方を選択するのではなく、両方のデータ構造を同時に実装しています。
    (データベース・バッファ・キャッシュが行指向のデータ構造を持ちます)
  2. 処理内容に応じて、行指向 / 列指向データのどちらを応答に使用するか、Oracle Database が自動的により適切なものを選択しますので、ユーザ側で使い分けを意識する必要がありません。
  3. 既存のオブジェクトに対して指定することによりインメモリ化が可能で、新規にインメモリ表専用のオブジェクトの作成を行う必要がありません。
  4. データベース外部からは透過的な機能のため、既存アプリケーションを変更することなく、そのままお使いいただけます。
  5. RAC オプションと併用することで、インメモリ・データストアについてもスケールアウトが可能です。

なかでも最大の特徴が、(1) の「行指向 / 列指向の両方のデータ構造を単一テーブル内で同時に使用できる」という点となります。こちらの実装により、「OLTP に適したデータ構造を持ちつつ、分析系の処理を高速に実行する」という相反する特性を同時に実現しています。一方で、この特徴を実現するためにメモリ上でデータを二重に持つことになるため、本機能を使用する際には従来より多くの SGA 領域を必要とします。

また、(3) に記載の通り、基本的にはインメモリ化する表を新たに作り直す必要はありません。しかし、分析対象となる表によっては、インメモリ化にはサイズが大きすぎる、といった理由により、中間表やパーティションを追加で作成するなどの対処が必要になる可能性があることをご留意ください。

まとめ

Oracle Database In-Memory は指定されたデータを列指向の形式でメモリ上に展開し、SQL のパフォーマンスを向上させる機能であり、OLTP と分析という異なった特性の両方の処理に対して、優れた性能を発揮できます。一方、メモリをより多く占有する性質上、使用にあたってはインメモリ化するデータの選定や追加で必要となるメモリ量などを十分に検討する必要があります。

OLTP 目的で構築されたデータベースに対して、データ設計を変更することなく大規模な分析処理を行いたいときなどに特に効果を発揮する機能といえます。お使いのシステムの要件や特性を踏まえたうえで使用をご検討ください。

(オラクル事業部 技術担当サポートセンターG 平林)