1 Oracle Database In-Memoryの概要

Oracle Database In-Memory (Database In-Memory)は、リアルタイム分析と混合ワークロードのパフォーマンスを大幅に改善する一連の機能です。インメモリー列ストア(IM列ストア)は、Database In-Memoryの主要機能です。

注意:

Database In-Memoryの機能には、Oracle Database In-Memoryオプションが必要となります。Database In-Memoryベース・レベルの場合、IM列ストアのサイズはCDBレベルで16 GBに制限されます。異なるエディションとサービスでサポートされる機能の詳細は、『Oracle Databaseライセンス情報ユーザー・マニュアル』を参照してください。

1.1 Oracle Database Release 20c for In-Memory Guideの変更点

今回のリリースの主な新機能は次のとおりです。

  • Database In-Memoryベース・レベル

    Database In-Memoryベース・レベルを有効にするには、INMEMORY_FORCE初期化パラメータにBASE_LEVELを設定します。ベース・レベルでは、Oracle Database In-Memoryオプションを購入することなくインメモリー機能を試すことができます。

    ベース・レベルが有効である場合、IM列ストアのサイズは、Oracle RACデータベースの各データベース・インスタンスおよびCDBで16 GBに制限されます。また、すべてのオブジェクトおよび列の圧縮レベルが自動的かつ透過的にQUERY LOWに設定され、自動インメモリーが無効になります。Oracle Exadataの場合、CELLMEMORY機能は無効になります。

    CDBまたはPDBに対するIM列ストアの有効化およびOracle Databaseライセンス情報ユーザー・マニュアルを参照してください。

  • 自動インメモリーの機能拡張

    INMEMORY_AUTOMATIC_LEVEL初期化パラメータがHIGHに設定されている場合、既存のINMEMORY設定がないセグメントはすべて自動的にINMEMORY MEMCOMPRESS AUTOとマークされます。ワークロードの完全な知識を持ち、インメモリー・アクセスのために有効にするオブジェクトを決定し、そのオブジェクトを手動で移入するという必要はありません。IM列ストアは大部分が自己管理です。

    インメモリー・オブジェクトの管理の自動化を参照してください。

  • Database In-Memory外部表拡張

    INMEMORY句は、表レベルおよびパーティション化された外部表またはハイブリッド外部表のパーティション・レベルでサポートされます。ハイブリッド表の場合、表レベルのINMEMORY属性は、内部または外部にかかわらず、すべてのパーティションに適用されます。

    インメモリー外部表およびインメモリー外部表の作成: 例を参照してください。

  • インメモリー全文列

    INMEMORY TEXT句は、インメモリー表の非スカラー列に適用できます。この句を使用すると、CONTAINS()演算子またはJSON_TEXTCONTAINS()演算子を使用したテキスト、XMLまたはJSONドキュメントの高速インメモリー検索が可能になります。IM列ストアにスカラー列と非スカラー列の両方が含まれている場合、その両方の型のデータにアクセスするOLAPアプリケーションは、行ベースの記憶域へのアクセスを回避できるためパフォーマンスが向上します。

    IM全文列を参照してください。

  • インメモリー・ハイブリッド・スキャン

    Oracle Databaseでは、すべての列がIM列ストアに移入されているわけではない場合に、移入された表に対するインメモリー・ハイブリッド・スキャンをサポートします。SELECTリストの一部の列がNO INMEMORYで、述語のすべての列がINMEMORYの場合、問合せはインメモリー・ハイブリッド・スキャンの対象になります。インメモリー・ハイブリッド・スキャンでは、IM列ストアの一部のデータに、また行ストアの一部のデータにアクセスできるため、純粋な行ストア問合せより桁違いにパフォーマンスが向上することがあります。

    インメモリー・ハイブリッド・スキャンを参照してください。

  • インメモリー・ディープ・ベクトル化

    インメモリー・ディープ・ベクトル化フレームワークでは、SIMDベクトル処理手法を使用した結合などの複雑なSQL演算子を最適化します。この機能はデフォルトで有効になっていますが、INMEMORY_DEEP_VECTORIZATION初期化パラメータをfalseに設定することによって無効にできます。

    インメモリー・ディープ・ベクトル化を使用した結合の最適化を参照してください。

  • JSONデータ型

    JSONデータ型は、Oracle固有バイナリ形式でJSONドキュメントを表現します。この形式は、問合せとDML処理に向けて最適化されていて、IM列ストアでのJSON処理のパフォーマンスが向上します。

    JSONデータのSIMDアクセスおよび静的式: バイナリJSON列を参照してください。

  • データベース・インメモリーの空間サポート

    IM列ストアに格納されている空間表に対して空間フィルタ操作(SDO_FILTER)を実行できます。より高速な問合せパフォーマンスを実現するために、インメモリー空間表に空間索引を作成して維持する必要はなくなりました。

    IM仮想列の有効化を参照してください。

1.2 分析アプリケーションの課題

従来、分析問合せでの優れたパフォーマンスの獲得は、いくつかの要件を満たすことを意味していました。

一般的なデータ・ウェアハウスまたは多目的データベースでは、次のような要件があります。

  • ユーザー・アクセス・パターンを理解する必要があります。

  • 優れたパフォーマンスを提供する必要があります。それには、一般に、索引、マテリアライズド・ビューおよびOLAPキューブの作成が必要となります。

たとえば、OLTPアプリケーションに対して優れたパフォーマンスを提供するために、表に1つから3つまでの索引(主キーが1つと外部キー索引が2つ)を作成する場合は、分析問合せに対して優れたパフォーマンスを提供するために索引の追加作成が必要になる場合があります。

図1-1 複数の索引

図1-1の説明が続きます
「図1-1 複数の索引」

前述の要件を満たすと、管理性およびパフォーマンスに関する問題が生まれます。追加のアクセス構造は、それらを作成、管理および調整する必要があることから、パフォーマンスのオーバーヘッドをもたらします。たとえば、単一の行を表に挿入すると、この表内のすべての索引を更新する必要が生じ、応答時間が長くなります。

リアルタイム分析に対する需要は、より多くの分析問合せが混合ワークロード・データベースで実行されていることを意味します。従来のアプローチでは持ちこたえることはできません。

1.3 単一形式アプローチ

従来、リレーショナル・データベースには、行形式か列形式のどちらかでデータが格納されます。メモリーおよびディスクには、同じ形式でデータが格納されます。

Oracleデータベースでは、行はデータ・ブロック内に隣接して格納されます。たとえば、3つの行がある表の場合、Oracleデータ・ブロックには、まず1つ目の行、次に2つ目の行、次に3つ目の行が格納されます。各行には、その行のすべての列値が含まれます。行形式で格納されたデータは、トランザクション処理のために最適化されます。たとえば、少数の行ですべての列を更新すると、少数のブロックのみが変更されます。

分析問合せに関する問題に対処するために、一部のデータベース・ベンダーでは、列形式が採用されています。列データベースには、行ではなく、選択された列が隣接して格納されます。たとえば、大きなsales表では、ある列に販売IDが存在し、別の列に販売地域が存在します。

分析ワークロードでは、スキャン中に少数の列にしかアクセスしませんが、データ・セット全体をスキャンします。このため、列形式は、分析には最も効率的となります。列は別々に格納されるため、分析問合せで、必要な列のみにアクセスでき、不要なデータを読み取らずにすみます。たとえば、地域別販売額に関するレポートで、少数の列のみにアクセスしながら、多数の行を迅速に処理できます。

データベース・ベンダーは、一般に、顧客に列形式と行ベース形式のどちらかを選択することを強います。たとえば、データ形式が列の場合、データベースでは、メモリー内とディスク上の両方で列形式でデータが格納されます。一方の形式の利点を得ることは、もう一方の形式の利点を失うことを意味します。アプリケーションでは、迅速な分析または迅速なトランザクションのどちらかが実現されますが、両方ではありません。多目的データベースのパフォーマンス問題は、単一形式でのデータの格納では解決されません。

1.4 Oracle Database In-Memoryソリューション

Oracle Database In-Memory (Database In-Memory)機能セットには、インメモリー列ストア(IM列ストア)、高度な問合せ最適化、および可用性のソリューションが含まれています。

Database In-Memoryの最適化により、データ・ウェアハウスおよび多目的データベース上で、分析問合せを桁違いの速さで実行できるようになります。

1.4.1 Database In-Memoryとは

Database In-Memory機能セットには、IM列ストア、高度な問合せ最適化、および可用性のソリューションが含まれています。

Database In-Memory機能を組み合せることで、OLTPのパフォーマンスまたは可用性を犠牲にすることなく、分析問合せが桁違いに高速化されます。

関連項目:

Database In-Memoryオプションの詳細は、Oracle Databaseライセンス情報ユーザー・マニュアルを参照

1.4.1.1 IM列ストア

IM列ストアでは、表、パーティションおよび個別の列のコピーが、高速スキャン向けに最適化された圧縮列形式で保持されます。

IM列ストアでは、各表またはビューのデータが行ではなく列ごとに格納されます。各列は、個別の行サブセットに分割されます。インメモリー圧縮単位(IMCU)というコンテナに、表セグメント内の行のサブセットのすべての列が格納されます。

ビデオ:

SGAの記憶域

IM列ストアは、システム・グローバル領域(SGA)のオプション部分である、インメモリー領域に存在します。IM列ストアは行ベース・ストレージまたはデータベース・バッファ・キャッシュに代わるものではありませんが、それを補完します。データベースでは、データは、行ベースおよび列形式の両方でメモリー内に存在できるようになり、両方の長所が提供されます。IM列ストアにより、ディスク形式とは無関係な、トランザクションの一貫性がある、表データのコピーがさらに提供されます。

図1-2 デュアルフォーマット・データベース

図1-2の説明が続きます。
「図1-2 デュアルフォーマット・データベース」の説明

注意:

IM列ストアに移入するオブジェクトをバッファ・キャッシュにもロードする必要はありません。

IM列ストアへのオブジェクトの移入

インメモリー移入は、ディスク上の行ベースのデータからIM列ストア内の列データへの自動変換です。INMEMORY_AUTOMATIC_LEVEL初期化パラメータがHIGHに設定されると、データベースは自動的に最適なセグメントと列を決定してIM列ストアに移入し、アクセス頻度の低いセグメントを削除します。ユーザーの意思決定は必要ありません。

あるいは、IM列ストアを手動で管理し、オブジェクトまたは列レベルでINMEMORY句を指定し、オブジェクトを移入する時期を選択することもできます。INMEMORY句は、次のいずれかのレベル(リストされた最下位レベルから最上位レベルまで)で指定できます。

  • 列(非仮想または仮想)

  • 表パーティション(内部または外部)

  • 表(内部または外部)またはマテリアライズド・ビュー

  • 表領域

任意のオブジェクトに対して、その列のすべてまたはサブセットを移入用に構成できます。同様に、パーティション化された表またはマテリアライズド・ビューの場合は、パーティションのすべてまたはサブセットを移入のために構成できます。

1.4.1.2 高度な問合せ最適化

Database In-Memoryには、分析問合せのためのいくつかのパフォーマンス最適化が含まれています。

最適化には、次のものがあります。

  • は、1つ以上の値、演算子、および値を解決するSQL関数(DETERMINISTICのみ)の組合せです。デフォルトでは、インメモリー式(IM式)最適化により、DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONSプロシージャでの、IM列ストア内のホットな式の特定および移入が可能になります。IM式は、非表示の仮想列としてマテリアライズされますが、非仮想列と同じ方法でアクセスされます。

  • 結合グループとは、表のセットを結合するために頻繁に使用される列のセットを指定するユーザー定義のオブジェクトです。特定の問合せで、結合グループにより、データベースで列値を解凍およびハッシュするパフォーマンス上のオーバーヘッドを排除できます。

  • 小さいディメンション表を大きいファクト表に結合する集計問合せの場合、インメモリー集計(IM集計)では、VECTOR GROUP BY操作を使用してパフォーマンスを向上させます。この最適化では、後でではなくファクト表のスキャンに、データが集計されます。

  • IM列ストアでは、再移入とは、IMCU内のデータが著しく変更された後のIMCUの自動更新です。IMCUに失効エントリがあるが失効しきい値に満たない場合、バックグラウンド・プロセスにより、IM列ストアの段階的な再移入である、トリクル再移入が引き起こされることがあります。

1.4.1.3 高可用性のサポート

可用性は、要求に応じてアプリケーション、サービスまたは機能がどの程度使用可能であるかを表しています。

Database In-Memoryでは、次の可用性機能がサポートされています。

  • インメモリー・ファスト・スタート(IMファスト・スタート)では、データベース・インスタンス再起動時のIM列ストアへのデータ移入時間が短縮されます。IMファスト・スタートは、IM列ストアに現在移入されているデータのコピーを、ディスク上に圧縮された列形式で定期的に保存することによって、移入時間を削減します。

  • Oracle Real Application Clusters (Oracle RAC)環境の各ノードには、独自のIM列ストアがあります。完全に異なるオブジェクトを各ノードに移入させることや、大きなオブジェクトをクラスタ内のすべてのIM列ストア間で分散させることが可能です。Engineered Systemsでは、同じオブジェクトを各ノードのIM列ストアに存在させることも可能です。

  • Oracle Database 12cリリース2 (12.2)以降、IM列ストアは、Active Data Guard環境内のスタンバイ・データベース上でサポートされています。

関連トピック

1.4.2 分析問合せのパフォーマンスの向上

圧縮された列形式によって、高速スキャン、問合せ、結合および集計が可能になります。

1.4.2.1 データ・スキャンのパフォーマンスの向上

列形式では、大量のデータをスキャンするために高速なスループットが提供されます。

IM列ストアを使用すると、データをリアル・タイムで分析して、様々な可能性を探り、反復を実行できます。具体的には、IM列ストアでは、次を実行する問合せのパフォーマンスが大幅に向上します。

  • 多数の行をスキャンし、<>=およびINなどの演算子を使用するフィルタを適用する

  • 表、または100列のうちの5列にアクセスする問合せなど、多数の列を持つマテリアライズド・ビューから、わずかな列を選択する

  • 問合せでCONTAINS()またはJSON_TEXTCONTAINS()演算子が指定されている場合は、テキスト、XMLまたはJSONドキュメントの高速インメモリー検索が有効になります。

注意:

IM全文列

1.4.2.1.1 純粋なインメモリー・スキャン

純粋なインメモリー・スキャンでは、すべてのデータがIM列ストアからアクセスされます。

IM列ストアのスキャンは、次の理由から、行ベースのデータのスキャンよりも高速になります。

  • バッファ・キャッシュのオーバーヘッドの排除

    IM列ストアには、純粋なインメモリー列形式でデータが格納されます。データは、データ・ファイル内に存在し続けたり、REDOを生成することはありません。そのため、データベースにより、ディスクからバッファ・キャッシュへのデータの読取りのオーバーヘッドがなくなります。

  • データ・プルーニング

    データベースでは、データの行全体ではなく、問合せに必要な列のみがスキャンされます。また、データベースでは、記憶域索引および内部ディクショナリを使用して、特定の問合せのための必要なIMCUのみが読み取られます。たとえば、問合せで、店舗IDが8未満の店舗のすべての売上高がリクエストされた場合、データベースでは、IMCUプルーニングを使用して、この値を含まないIMCUを除外できます。

  • 圧縮

    従来は、圧縮の目的は領域の節約です。IM列ストアでは、圧縮の目的はスキャンの高速化です。データベースは、圧縮された形式に対してWHERE句の述部が適用されるアルゴリズムを使用して、自動的に列データを圧縮します。Oracle Databaseでは、適用された圧縮のタイプによっては、データを最初に解凍することなく、その圧縮された形式でスキャンできます。したがって、データベースで、IM列ストア内でスキャンする必要があるデータの量は、データベース・バッファ・キャッシュ内の対応する量より少なくなります。

  • ベクター処理

    各CPUコアにより、ローカルのインメモリー列がスキャンされます。データを配列として処理するために、スキャンはSIMD (単一命令、複数データ)ベクター命令を使用します。たとえば、問合せでは、値を1つずつ読み取るのではなく、単一のCPU命令で一連の値を読み取ることができます。CPUコアによるベクター・スキャンは、行スキャンよりも桁違いに高速です。

たとえば、次の非定型の問合せを実行するとします。

SELECT cust_id, time_id, channel_id
FROM   sales
WHERE  prod_id BETWEEN 14 and 29
ORDER BY 1, 2, 3;

バッファ・キャッシュを使用する際、データベースでは通常、索引をスキャンして製品IDを検索し、ROWIDを使用してディスクからバッファ・キャッシュに行をフェッチしてから、不必要な列値を廃棄します。行形式でバッファ・キャッシュ内のデータをスキャンすると、多くのCPU命令が必要となり、CPU効率が最善ではなくなります。

IM列ストアを使用する場合は、データベースで、ディスク全体ではなく、リクエストされたsales列のみスキャンできます。列形式でデータをスキャンすると、必要な列のみをCPUにパイプライン処理し、効率が向上します。各CPUコアは、SIMDベクター命令を使用してローカル・インメモリー列をスキャンします。

ビデオ:

1.4.2.1.2 インメモリー・ハイブリッド・スキャン

インメモリー・ハイブリッド・スキャンでは、行がIM列ストアと行ストアの両方から取得されます。

選択列機能を使用して、インメモリー・アクセス用のオブジェクトの列のサブセットを有効にできます。たとえば、アプリケーション問合せで指定されたsales列がprod_idcust_idおよびamount_soldのみの場合、これらの列にのみINMEMORY属性を適用することでメモリーを節約することもできます。ただし、次の非定型の問合せを発行する場合があります。

SELECT prod_id, time_id FROM sales WHERE cust_id IN (100,200,300);

time_idNO INMEMORY列であるため、問合せでは、パフォーマンスが低下する可能性がある行ストアからデータを取得する必要があります。ただし、次の条件が満たされるため、オプティマイザはインメモリー・ハイブリッド・スキャンを考慮できます。

  • 述語のすべての列がINMEMORYです。この例では、cust_idが唯一の述語列で、INMEMORYです。

  • SELECTリストには、NO INMEMORY列とINMEMORY列の任意の組合せが含まれていること。この例では、prod_idINMEMORYですが、time_idNO INMEMORYです。

salesの単一の表スキャン内で、インメモリー・ハイブリッド・スキャンはIM列ストア内のデータをフィルタし、行ストアからデータを投影します。このように、インメモリー・ハイブリッド・スキャンによって応答時間が桁違いに向上する可能性があります。

1.4.2.2 結合のパフォーマンスの向上

ブルーム・フィルタは、セット内のメンバーシップをテストする、低メモリーのデータ構造です。IM列ストアでは、ブルーム・フィルタを利用して、結合のパフォーマンスを向上させます。

ブルーム・フィルタは、小さなディメンション表上の述語を大規模なファクト表上のフィルタに変換して、結合を高速化します。この最適化は、1つの大きなファクト表で複数ディメンションの結合を実行する場合に有効です。ファクト表のディメンション・キーには、繰返しの値が数多くあります。スキャンのパフォーマンスと繰返し値の最適化により、結合の速度は桁違いに向上します。

1.4.2.3 集計のパフォーマンスの向上

分析の重要な側面は、データの集計によって、パターンと傾向を判断することです。データがIM列ストアに格納されていると、集計と複合的なSQL問合せはより高速に実行されます。

Oracle Databaseでは、一般に、集計にはGROUP BY句が関係します。従来は、データベースではSORTおよびHASH操作が使用されていました。Oracle Database 12cリリース1 (12.1)以降、データベースでは、効率的な配列ベースのインメモリー集計を可能にするために、VECTOR GROUP BY変換を提供していました。

ファクト表のスキャン中に、データベースにより、集計値がインメモリー配列に蓄積され、効率的なアルゴリズムを使用して集計が実行されます。主キーと外部キーの関係に基づく結合が、スター・スキーマとスノーフレーク・スキーマの両方に対して最適化されます。

1.4.3 混合ワークロードのパフォーマンスの向上

OLTPアプリケーションには、IM列ストア内のデータへのアクセスによる恩恵はありませんが、デュアルメモリー形式により、間接的にOLTPパフォーマンスを改善できます。

すべてのデータが行に格納されている場合、分析問合せのパフォーマンスの改善には、アクセス構造の作成が必要になります。標準的なアプローチは、分析索引、マテリアライズド・ビューおよびOLAPキューブの作成です。たとえば、ある表で、OLTPアプリケーションのパフォーマンスを改善するために3つの索引(主キー1つと外部キー索引2つ)が必要となり、分析問合せのパフォーマンスを改善するために10個から20個の索引がさらに必要となるとします。この方法では、分析問合せのパフォーマンスを改善できますが、OLTPのパフォーマンスが低下します。表に1行挿入するには、その表のすべての索引を変更する必要があります。索引の数が増えると、挿入速度が低下します。

データをIM列ストアに移入する場合は、分析アクセス構造を使用しないようにすることができます。この方法では、必要な索引、マテリアライズド・ビューおよびOLAPキューブが少なくなるため、記憶域領域および処理のオーバーヘッドが減少します。たとえば、1回の挿入では、11から23個ではなく、1から3個の索引が変更されます。

IM列ストアにより、ビジネス・アプリケーションにおける分析問合せのパフォーマンスを大幅に向上させることができる一方で、索引参照を使用して短いトランザクションを実行するその場かぎりの分析問合せ、およびデータ・ウェアハウスのワークロード、純粋なOLTPデータベースには、利益が少なくなります。次のタイプの問合せの場合、IM列ストアによってパフォーマンスは向上しません。

  • 述語が複雑な問合せ

  • 多数の列を選択する問合せ

  • 多数の行を返す問合せ

関連項目:

物理的なデータ・ウェアハウス設計の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。

1.4.4 Exadataフラッシュ・キャッシュのインメモリー・サポート

INMEMORYとマークされたすべてのオブジェクトが同時にDRAMメモリーに収まるわけではありません。Oracle Exadata Storage Serverソフトウェアを使用する場合は、Exadataスマート・フラッシュ・キャッシュを補足メモリーとして使用できます。

IM列ストアが有効になっている場合、Exadataスマート・フラッシュ・キャッシュは、自動的にインメモリー列形式にデータを再フォーマットします。以前のExadataリリースでは、ハイブリッド列圧縮データのみがIM列形式のフラッシュ記憶域の対象でした。再フォーマットは、圧縮された表(OLTP圧縮を含む)と圧縮されていない表の両方で行われます。

注意:

Database In-Memoryベース・レベルが有効である場合は、ExadataスキャンおよびCELLMEMORY表への移入が無効になります。

この形式では、結合や集計など、Database In-Memoryのほとんどのパフォーマンス拡張機能がSmart Scanでサポートされています。また、非圧縮およびOLTP圧縮のデータ・ブロックをIM列形式に再フォーマットすると、必要なフラッシュ・メモリーの量を大幅に削減できます。

Exadataスマート・フラッシュ・キャッシュは、次の段階でデータを変換します。

  1. Oracle Exadataは、データがすぐに利用できるように、対象のスキャンから従来の列形式でデータをキャッシュします。この形式は列形式ですが、IM列ストアで使用する形式と同じではありません。

  2. バックグラウンドでは、Oracle Exadataはデータをより低い優先度で純粋なIM列ストア形式に再フォーマットします。バックグラウンドの書込みは、メイン・ワークロードへの干渉を防止します。

データベースがOLTPワークロードを実行していない場合、データ・ウェアハウス・ワークロードがフラッシュ・キャッシュの100%を消費する可能性があります。ただし、OLTPワークロードでは、データ・ウェアハウスのワークロードがフラッシュ・キャッシュの50%以下に制限されます。この最適化により、分析スキャンでOLTPワークロードのパフォーマンスが犠牲になることはありません。

デフォルトでは、Exadataスマート・フラッシュ・キャッシュは、レベルMEMCOMPRESS FOR CAPACITY LOWを使用してデータを圧縮します。圧縮レベルを変更するか、列形式を完全に無効にするには、ALTER TABLE ... NO CELLMEMORY文を使用します。

関連項目:

1.4.5 高可用性のサポート

IM列ストアは、Oracle Databaseに十分に組み込まれています。すべての高可用性機能がサポートされています。

列形式によって、Oracleデータベースのディスク・ストレージ形式が変更されることはありません。したがって、バッファ・キャッシュの変更およびREDOロギング機能も同様です。RMAN、Oracle Data GuardおよびOracle ASMなどの機能は、十分にサポートされています。

Oracle Real Application Clusters (Oracle RAC)環境では、デフォルトで、各ノードに固有のIM列ストアがあります。要件に応じて、様々な方法でオブジェクトを移入できます。

  • 様々な表がすべてのノードに移入されます。たとえば、あるノード上にsalesファクト表があるのに対して、別のノード上にはproductsディメンション表があるなどです。

  • 単一の表が様々なノード間で分散されます。たとえば、ハッシュパーティション化された同じ表の様々なパーティションが様々なノード上にある場合や、パーティション化されていない単一の表の様々なROWID範囲が様々なノード上にある場合などがあります。

  • 一部のオブジェクトは、すべてのノード上のIM列ストア内に存在します。たとえば、productsディメンション表はすべてのノードに移入するが、salesファクト表のパーティションは様々なノードにわたり分散するなどです。

関連項目:

高可用性とIM列ストア

1.4.6 導入の容易性

Database In-Memoryは実装が単純であり、アプリケーション変更は必要になりません。

Database In-Memoryの導入の重要側面を次に示します。

  • デプロイの容易性

    ユーザーの管理によるデータ移行は必要ありません。データベースでは、ディスク上に行形式でデータが格納され、IM列ストアの移入時に、自動的に行データが列形式に変換されます。

  • 既存のアプリケーションとの互換性

    アプリケーションの変更は不要です。オプティマイザにより、自動的に列形式が利用されます。ご使用のアプリケーションで、データベースに接続してSQLを発行する場合、それにはDatabase In-Memoryの機能が役立ちます。

  • 完全なSQL互換性

    Database In-Memoryでは、SQLに関して制限はありません。分析問合せには、Oracleの分析機能を使用するか、カスタマイズされたPL/SQLコードを使用するかに関係なく、利点があります。

  • 設定が容易

    複雑な設定は必要ありません。INMEMORY_SIZE初期化パラメータで、IM列ストアで使用するために予約するメモリーの量が指定されます。IM列ストアを構成すると、既存の分析ワークロードと非定型問合せのパフォーマンスがただちに向上します。

  • オブジェクトの管理が容易

    自動インメモリーは、アクセス・トラッキングと列統計を使用して、IM列ストア内のオブジェクトを管理します。INMEMORY_AUTOMATIC_LEVEL初期化パラメータがHIGHに設定されると、データベースは自動的に最適なセグメントと列を決定してIM列ストアに保持し、コールド(アクセス頻度が低い)・セグメントを削除します。ユーザーの意思決定は必要ありません。

    注意:

    INMEMORY_FORCE初期化パラメータにBASE_LEVELが設定されている場合は、INMEMORY_AUTOMATIC_LEVELが設定されていても自動インメモリーは無効になります。表の圧縮レベルがAUTOの場合でも、自動インメモリー・バックグラウンド操作は実行されません。

  • インメモリー・オブジェクトと列の任意のファイングレイン制御

    INMEMORY_AUTOMATIC_LEVELHIGHに設定されていない場合、DDL文のINMEMORY句ではIM列ストアに移入するオブジェクトまたは列を指定します。特定のオブジェクトまたは特定の列のみがインメモリー移入の対象となるように指定できます。

関連項目:

1.5 Database In-Memoryの要件

Oracle Database In-Memoryオプションは、すべてのDatabase In-Memory機能に必要となります。Database In-Memoryベース・レベルは、16 GB以下のIM列ストアに使用できます。

要件を次に示します。

  • Database In-Memoryベース・レベルを使用するには、CDBレベルの初期化パラメータ・ファイルで、INMEMORY_FORCE初期化パラメータにBASE_LEVELを設定する必要があります。このパラメータは動的に設定できず、PDBレベルで設定することもできません。BASE_LEVELを設定すると、次のような動作になります。

    • すべてのINMEMORYオブジェクトおよび列の圧縮レベルにQUERY LOWが自動的かつ透過的に使用されます。

    • 自動インメモリーが無効になります。

  • ベース・レベルの場合は、IM列ストアのサイズが16 GBを超えないようにする必要があります。

  • IM列ストアには、最小で100 MBのメモリーが必要となります。ストア・サイズは、MEMORY_TARGETに含まれています。

  • Oracle RACデータベースの場合は、次の追加の要件が適用されます。

    • DUPLICATEおよびDUPLICATE ALLオプションでは、Oracleエンジニアド・システムが必要となります。

    • INMEMORY_FORCE初期化パラメータにBASE_LEVELを設定すると、各データベース・インスタンスのサイズは16 GBに制限されます。

IM列ストアには、特別なハードウェアは必要ありません。

関連項目:

1.6 Database In-Memoryのための主要な作業

IM列ストアの利点を得るための問合せに必要なタスクは、IM列ストアのサイズ変更のみです。問合せの最適化および可用性の機能には、さらに構成が必要となります。

IM列ストアの構成のための主要な作業

次の表には、主要構成タスクが示されます。

表1-1 構成タスク

タスク ノート 必要な場合 詳細情報

サイズを指定することで、IM列ストアを有効にします。

INMEMORY_SIZEに少なくとも100 MBを設定します。

Database In-Memoryベース・レベルのみの場合は、Oracle RACデータベースの各データベース・インスタンスおよびCDB全体のサイズが16 GB以下である必要があります。

COMPATIBLE初期化パラメータは12.1.0以上に設定されている必要があります。

すべてのDatabase In-Memory機能に必要

CDBまたはPDBに対するIM列ストアの有効化

Database In-Memoryベース・レベルの場合は、追加の構成を実行します。

Database In-Memoryベース・レベルのみの場合、CDBレベルでINMEMORY_FORCE初期化パラメータにBASE_LEVELを設定し、INMEMORY_SIZEを16 GB以下にする必要があります。

Database In-Memoryベース・レベルの場合にのみ必要

CDBまたはPDBに対するIM列ストアの有効化

自動インメモリーを構成してコールド・セグメントを有効化、移入および削除し、作業データ・セットが常に移入されるようにします。

INMEMORY_AUTOMATIC_LEVEL初期化パラメータがHIGHに設定されている場合、Oracle Databaseは内部使用の統計を使用して、ワークロードを管理します。たとえば、sales表の特定のパーティションが頻繁に問合せされているとデータベースが判断すると、それらのパーティションをINMEMORYとして有効化して移入します。ワークロードが変更され、セグメントが「コールド」になると、セグメントはホット・セグメントに置き換えられます。

注意: INMEMORY_FORCE初期化パラメータにBASE_LEVELが設定されている場合は、INMEMORY_AUTOMATIC_LEVELが設定されていても自動インメモリーは無効になります。表の圧縮レベルがAUTOの場合でも、自動インメモリー・バックグラウンド操作は実行されません。

Database In-Memoryオブジェクトの完全自動管理に必要

自動インメモリーの構成

IM列ストアへの移入のために、列、パーティション、表またはマテリアライズド・ビュー、表領域を有効にします。

INMEMORY_AUTOMATIC_LEVELHIGHに設定されている場合を除き、すべてのオブジェクトはデフォルトでNO INMEMORYになります。これは、IM列ストアにデータを移入できないことを意味します。DDL文でINMEMORY句を手動で指定すると、オブジェクトに対してインメモリー・アクセスが有効になります。つまり、移入が可能になります。

注意: INMEMORY_FORCE初期化パラメータにBASE_LEVELが設定されている場合は、INMEMORYオブジェクトおよび列でQUERY LOW圧縮が自動的に使用されます。データ・ディクショナリ・ビューには既存の圧縮設定が引き続き表示される場合がありますが、ベース・レベルでは常にオブジェクトおよび列がQUERY LOWレベルで透過的に圧縮されます。

INMEMORY_AUTOMATIC_LEVELHIGHでない場合に必要です

インメモリー移入に対するオブジェクトの手動による有効化

オブジェクトをIM列ストアに手動で移入します。

インメモリー・アクセス用にオブジェクトを有効化することとオブジェクトを移入することは、別のステップになります。INMEMORY_AUTOMATIC_LEVELHIGHに設定されている場合を除き、オブジェクトの移入はINMEMORY ... PRIORITY設定によって決まります。NONE (デフォルト)に設定した場合は、問合せまたはPL/SQLコールを使用して、手動でオブジェクトを移入する必要があります。そうしないと移入されません。

INMEMORY ... PRIORITYNONEに設定されていない場合、データベースはキュー内の位置に基づいて、インスタンスの起動後にINMEMORYオブジェクトを自動的に読み込みます。たとえば、優先度がHIGHのオブジェクトは、優先度がLOWのオブジェクトよりも先に移入されます。この場合、オブジェクトを手動で移入する必要はありません(キューをオーバーライドする場合を除く)。

PRIORITY設定がNONEの場合に必要です

IM列ストアの手動での移入

自動データ最適化(ADO)ポリシーを作成して、IM列ストア内のオブジェクトに対してINMEMORY属性を設定します。

たとえば、ポリシーにより、10日間アクセスがなかった場合にIM列ストアからsales表を除去できます。インメモリーADO機能では、HEAT_MAP=ONONに設定し、INMEMORY_SIZEをゼロ以外の値に設定する必要があります。

オプション

IM列ストアに対するADOの有効化

インメモリー問合せの最適化のための主要な作業

インメモリー問合せの最適化は、IM列ストアを機能させるために必要なわけではありません。次の最適化作業はオプションです。

表1-2 問合せ最適化タスク

タスク ノート 詳細情報

DBMS_INMEMORY_ADMINパッケージを使用することで、IM列ストア内のIM式の自動検出を管理します。

たとえば、IME_CAPTURE_EXPRESSIONSプロシージャを呼び出して、データベースでのホットな式を特定できる期間を定義してから、それらを段階的に移入します。INMEMORY_EXPRESSIONS_USAGE初期化パラメータは、データベースでの移入可能なIM式のタイプ(静的、動的、またはそれら両方)を制御します。

INMEMORY_EXPRESSIONS_USAGE

CREATE INMEMORY JOIN GROUP文を使用して結合グループを定義します。

候補は、ファクト表およびディメンション表を結合する列など、結合述語で頻繁に組み合せられる列です。

結合グループの作成

問合せブロックに必要な場合は、VECTOR_TRANSFORMヒントを指定してインメモリー集計を有効にするか、NO_VECTOR_TRANSFORMで無効にします。

インメモリー集計は、初期化パラメータやDDLで制御できない、自動的に有効になる機能です。

「IM集計の制御」

初期化パラメータINMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENTを設定することで、2分間にトリクル再移入によって更新されるIMCUの数を制限します。

この初期化パラメータを0に設定すると、トリクル再移入を無効にできます。

「しきい値ベース再移入とトリクル再移入」

可用性管理のための主要作業

次の表に、主要タスクを示します。

表1-3 可用性タスク

タスク ノート 詳細情報

DBMS_INMEMORY_ADMIN.ENABLE_FASTSTARTプロシージャを使用してインメモリー・ファスト・スタート(IMファスト・スタート)表領域を指定します。

IMファスト・スタートでは、データベースの再起動時にIM列ストアへのデータベース・オブジェクトの移入が最適化されます。IMファスト・スタートは、高速にIM列ストアの移入を行うために、ディスク上に情報を格納します。

IM列ストアに対するIMファスト・スタートの有効化

オブジェクトまたは表領域の場合は、DDL文でINMEMORYDISTRIBUTEまたはDUPLICATEキーワードとともに指定してOracle RACでのデータの分散を制御します。

デフォルトでは、各インメモリー・オブジェクトは、Oracle RACインスタンス間で分散され、IM列ストアのシェアード・ナッシング・アーキテクチャが効率的に使用されます。

Oracle RACでのIM列ストアのデプロイ

Oracle Data Guard環境では、プライマリまたはスタンバイ・データベース上で同じDatabase In-Memory初期化パラメータおよび文を使用できます。

たとえば、INMEMORY_SIZEを設定することで、プライマリおよびスタンバイ・データベースの両方で、IM列ストアを有効にできます。必要な場合は、DDLでINMEMORY DISTRIBUTE FOR SERVICE句を使用して、プライマリ・データベースおよびスタンバイ・データベース上でIM列ストアに異なるデータ・セットを移入します。

インメモリー移入に対するオブジェクトの手動による有効化について

1.7 IM列ストアのためのツール

IM列ストアまたはその他のDatabase In-Memory機能の管理には、特別なツールやユーティリティは必要ありません。SQL*Plus、SQL DeveloperおよびOracle Enterprise Manager (Enterprise Manager)などの管理ツールが十分にサポートされています。

この項では、特定のデータベース・インメモリー機能でサポートされているツールについて説明します。

1.7.1 インメモリー・アドバイザ

インメモリー・アドバイザは、データベース内の分析処理ワークロードを分析する、ダウンロード可能なPL/SQLパッケージです。

インメモリー・アドバイザでは、SQL計画のカーディナリティ、アクティブ・セッション履歴(ASH)、パラレル問合せの使用、およびその他の統計に基づいて、分析処理が他のデータベース・アクティビティと区別されます。インメモリー・アドバイザでは、統計およびヒューリスティックな圧縮要因に基づいて、IM列ストア内のオブジェクトのサイズが推定されます。

アドバイザでは、次の内容に基づいて、分析処理のパフォーマンスの向上要因が推定されます。

  • ユーザーのI/Oの待機、クラスタの転送の待機、およびバッファ・キャッシュのラッチの待機などの待機イベントの推定

  • 特定の圧縮タイプに関連する、問合せ処理の利点

  • 特定の圧縮タイプに対する、解凍コストの経験則

  • SQL計画のカーディナリティ、結果セット内の列の数など

出力は、インメモリー移入による利益を得られる、IM列ストアのサイズ、およびオブジェクトのリストをお薦めするレポートです。アドバイザでは、推奨されたオブジェクトをINMEMORY句で変更するSQL*Plusスクリプトも生成されます。

インメモリー・アドバイザは、ストアドPL/SQLパッケージには含まれません。Oracle Supportからパッケージをダウンロードする必要があります。

関連項目:

インメモリー・アドバイザの詳細は、My Oracle Supportノート1965343.1

1.7.2 IM列ストア用のCloud Controlページ

Enterprise Manager Cloud Control (Cloud Control)では、インメモリー列ストア中央ホーム・ページが用意されています。このページでは、IM列ストアへのダッシュボード・インタフェースが提供されます。

このページを使用して、表、索引、パーティション、表領域などのデータベース・オブジェクトに対するインメモリー・サポートを監視します。オブジェクトに対するインメモリー機能を表示し、インメモリーの使用状況統計を監視できます。特に指定のないかぎり、このマニュアルでは、Database In-Memoryの機能へのコマンドライン・インタフェースについて説明します。

関連項目:

Cloud ControlでのIM列ストアの使用では、Cloud Controlを使用してIM列ストアを管理する方法について説明します。

1.7.3 Oracle Compression Advisor

Oracle Compression AdvisorではMEMCOMPRESS句を使用してユーザーが実感できる圧縮率を推定します。アドバイザはDBMS_COMPRESSIONインタフェースを使用します。

1.7.4 Oracle Data PumpとIM列ストア

impdpコマンドのTRANSFORM=INMEMORY:yオプションを使用して、IM列ストアに対して有効になっているデータベース・オブジェクトをインポートできます。

このオプションを使用すると、Oracle Data Pumpにより、IM列ストア句が設定されたすべてのオブジェクトについて、その句が維持されます。TRANSFORM=INMEMORY:nオプションを指定すると、データ・ポンプは、IM列ストア句が設定されたすべてのオブジェクトからその句を削除します。

また、TRANSFORM=INMEMORY_CLAUSE:stringオプションを使用して、インポート時にダンプ・ファイルのデータベース・オブジェクトに対するIM列ストアを上書きできます。たとえば、このオプションを使用して、インポートされたデータベース・オブジェクトについて、IM列ストアの圧縮を変更できます。

ビデオ:

関連項目:

TRANSFORM impdbパラメータの詳細は、『Oracle Databaseユーティリティ』を参照してください。