インメモリー領域は、データベース・インスタンス内のオプションのシステム・グローバル領域(SGA)コンポーネントです。これにはインメモリー列ストア(IM列ストア)が含まれており、高速スキャン用に最適化された列形式を使用して表およびパーティションをメモリーに格納します。IM列ストアを使用すると、従来の行形式(バッファ・キャッシュ内)と列形式の両方でSGAにデータが同時に移入されます。データベースは、主キー参照などのオンライン・トランザクション処理(OLTP)問合せをバッファ・キャッシュに、分析およびレポートの問合せをIM列ストアに透過的に送信します。データをフェッチする場合は、Oracle Databaseで、同じ問合せ内で両方のメモリー領域からデータを読み取ることもできます。デュアル形式アーキテクチャではメモリー要件は倍増しません。バッファ・キャッシュは、データベースのサイズよりもはるかに小さいサイズで稼働するように最適化されます。

IM列ストアには、最もパフォーマンスが重要なデータのみを移入する必要があります。オブジェクトをIM列ストアに追加するには、オブジェクトを作成または変更するときにオブジェクトのINMEMORY属性を有効にします。この属性は、表領域(表領域の新しい表およびビューすべて)、表、パーティション、サブパーティション、マテリアライズド・ビュー、またはオブジェクト内の列のサブセットに対して指定できます。

IM列ストアでは、データとメタデータの両方が、従来のOracleデータ・ブロックではなく、最適化された記憶域単位で管理されます。インメモリー圧縮単位(IMCU)は、圧縮された、読取り専用の記憶域単位であり、1つ以上の列のためにデータを含みます。スナップショット・メタデータ単位(SMU)には、関連付けられたIMCUのメタデータおよびトランザクション情報が含まれます。すべてのIMCUは、別個のSMUにマップされます。

式統計ストア(ESS)は、式の評価に関する統計を格納するリポジトリです。ESSはSGAにあり、ディスクにも保持されます。IM列ストアが有効化されると、データベースはインメモリー式(IM式)機能のためにESSを活用します。インメモリー式単位(IMEU)は、マテリアライズドIM式およびユーザー定義仮想列の記憶域コンテナです。ESSはIM列ストアとは独立していることに注意してください。ESSはデータベースの永続コンポーネントで、無効化できません。

概念的には、IMEUは、その親IMCUの論理拡張です。IMCUに複数の列を含むことができるのと同様に、IMEUには複数の仮想列を含むことができます。すべてのIMEUは1つのIMCUのみにマップされ、同じ行セットにマップされます。IMEUには、関連付けられているIMCU内に含まれたデータについて式結果が含まれます。IMCUが移入されると、関連付けられているIMEUも移入されます。

一般的なIM式には、1つ以上の列が含まれており、定数が使用されている場合もあります。また、表内の行と1対1でマップされています。たとえば、EMPLOYEES表のIMCUには、列weekly_salaryの1行目から1000行目が含まれる場合があります。このIMCUに格納されている行について、IMEUで、自動検出されたIM式weekly_salary*52、およびweekly_salary*12として定義されているユーザー定義の仮想列quarterly_salaryが計算されます。IMCUの3行目は、IMEUの3番目の行にマップされます。

インメモリー領域は、次の2つのプールに分割されます。

2つのプールの相対的なサイズは内部ヒューリスティックによって決まります。インメモリー領域のメモリーの大部分は、1MBのプールに割り当てられます。インメモリー領域のサイズは、初期化パラメータINMEMORY_SIZE (デフォルトは0)によって制御され、最小サイズは100MBです。Oracle Database 12.2以降は、ALTER SYSTEMコマンドを使用してINMEMORY_SIZEパラメータを増やすことで(最小128MB単位)、インメモリー領域のサイズをその場で増加できます。インメモリー領域のサイズをその場で縮小することはできません。

Oracle Database In-Memoryには、ライセンス・トラッキングをトリガーせずに最大16GBの列ストアを使用できるベース・レベル機能があります。

インメモリー表は、表データが最初にアクセスされるか、データベースの起動時にIM列ストアに割り当てられたIMCUを取得します。表のインメモリー・コピーは、ディスク上の形式から新しいインメモリー列形式に変換することで作成されます。IM列ストアのコピーはメモリー内にのみ配置されるため、この変換はインスタンスが再起動するたびに実行されます。この変換が行われると、表のインメモリー・バージョンが問合せに使用可能になります。表が部分的に変換された場合は、表全体の変換を待機するのではなく、部分的なインメモリー・バージョンを使用して問合せを残りのディスクに移動できます。

インメモリー・ハイブリッド・スキャンでは、表のすべての列がIM列ストアに移入されていない場合に、IM列ストアの一部のデータおよび行ストアの一部のデータにアクセスできます。これにより、純粋な行ストア問合せよりも大きい順序でパフォーマンスが向上します。

自動インメモリーにより、ユーザーが操作しなくてもセグメントを移入、削除および再圧縮できるようになります。INMEMORY_AUTOMATIC_LEVELHIGHに設定されている場合、データベースではその使用パターンに基づいてセグメントの自動的な有効化および移入が可能になります。この自動化により、一度にIM列ストアに移入できるオブジェクト数が最大化されます。

サーバー・プロセスは、問合せおよびデータ操作言語(DML)に応じて、列データをスキャンし、SMUメタデータを更新します。バックグラウンド・プロセスは、ディスクからIM列ストアに行データを移入します。インメモリー・コーディネータ・プロセス(IMCO)は、列データのバックグラウンド移入および再移入を開始します。領域管理コーディネータ・プロセス(SMCO)および領域管理ワーカー・プロセス(Wnnn)では、IMCOにかわってデータの実際の移入および再移入を行います。DMLブロックの変更は、バッファ・キャッシュ、ディスクの順に書き込まれます。バックグラウンド・プロセスは、メタデータの無効化および問合せリクエストに基づいて、ディスクからIM列ストアに行データを再移入します。

インメモリー・ファストスタート機能を有効にして、IM列ストアの列データを圧縮列形式で元のデータベースの表領域に書込みできます。この機能により、データベースを高速に起動できます。この機能はIMEUには適用されないことに注意してください。これらは常にIMCUから動的に移入されます。

インメモリー・ディープ・ベクトル化では、各SQL演算子内の物理演算子をパイプライン化し、単一の命令、複数のデータ(SIMD)手法を使用してベクトル化することにより、複雑なSQL演算子を最適化できます。この機能はデフォルトで有効になっていますが、INMEMORY_DEEP_VECTORIZATION初期化パラメータをfalseに設定して無効にできます。