31.1 インメモリーJSONデータの概要

JSONデータをインメモリー列ストア(IM列ストア)に移入すると、非定型問合せおよび全文問合せのパフォーマンスを向上させることができます。

JSONデータにIM列ストアを使用すると、小さいJSON文書を大量にスキャンする非定型分析問合せで特に役に立ちます。

JSON列がJSONデータ型の場合は、IM列ストアを使用して全文検索をサポートすることもできます。(JSON型は、データベース初期化パラメータcompatibleが少なくとも20である場合にのみ使用できます。)

ノート:

IM列ストアにJSON列を配置するかわりに、列にJSON検索索引を作成する方法があります。これにより、非定型問合せと全文検索の両方がサポートされます。

IM列ストアに移入されるJSON列(任意のデータ型)にJSON検索索引を定義すると、IM列ストアではなく、検索索引がその列の問合せに使用されます。

IM列ストアを使用して全文検索をサポートする場合と異なり、JSON検索索引のサポートは、JSONデータ型の列のみでなく、すべてのJSON列に対して使用できます。

IM列ストアは、32,767バイトより小さいJSON文書に対してのみサポートされます。様々な文書サイズが混在する場合、32,767バイトより大きい文書はインメモリーの最適化が行われずに処理されます。よりよいパフォーマンスを得るために、32,767バイトを超える文書を小さい文書に分割することを検討します。

IM列ストアは任意に入力できるSGAプールです。ここには、迅速にスキャンできるように最適化された特殊な列形式で、表のコピーおよびパーティションが格納されています。IM列ストアはデータベース・バッファ・キャッシュの行ベース記憶域を補完します。IM列ストアとバッファ・キャッシュの両方に同じオブジェクトをロードする必要はありません。2つのキャッシュは、トランザクションの面で一定に保たれます。データベースは、バッファ・キャッシュにオンライン・トランザクション処理(OLTP)問合せ(主キーの検索など)を、IM列ストアに分析およびレポートの問合せを透過的に送信します。

インメモリーのJSONデータを使用することは、SQL/JSONパス・アクセスのパフォーマンス強化と考えられます。SQLファンクションおよび条件(json_tablejson_queryjson_valuejson_existsおよびjson_textcontains)は、すべてSQL/JSONパス引数を受け入れ、JSONデータをIM列ストアにロードすることでメリットを得ることができます。

JSON文書がメモリーにロードされると、この文書に対して以降に行われるパスベースの操作ではインメモリーの表現が使用されます。これにより、ディスク上で行われる読取りに関連するオーバーヘッドがなくなります。

問い合せされたJSONデータがIM列ストアに移入され、そのデータに適用できる関数ベースの索引がある場合、オプティマイザは索引を使用するか、インメモリーのデータをスキャンするかを選択します。一般的に、索引を調べた結果の文書がほとんどない場合には、オプティマイザによって関数索引が選ばれます。これは、実際には、オプティマイザが非常に選択的な問合せやDML文で関数索引を選ぶ可能性があることを意味します。

反対に、索引を調べた結果の文書が多くなる場合、オプティマイザは、関数ベースの索引の式を仮想列の式としてスキャンすることによるインメモリー・データのスキャンを選択する可能性があります。

非定型の問合せ(つまり、特定のSQL/JSONパス式を対象とするために頻繁には使用されない問合せ)では、データのスキャンを迅速に行えるため、JSONデータをIM列ストアに移入することで得られる一般的なメリットを受けられます。頻繁に使用する問合せがいくつかある場合は、次のようにしてそれらのパフォーマンスをさらに向上させることができます。

  • JSONデータの列から、スカラー値(配列内のものではない)を投影する仮想列を作成し、それらの仮想列をIM列ストアにロードする。

  • 頻繁に問い合せられるjson_table式にマテリアライズド・ビューを作成し、そのビューをIM列ストアにロードする。

ただし、関数json_valueを使用してスカラー値を投影する関数ベースの索引がある場合は、それを投影する仮想列を明示的に作成する必要はありません。前述したように、この場合は、関数ベースの索引の式がIM列ストアに仮想列として自動的にロードされます。オプティマイザは、推定されるコストに基づいて、関数ベースの索引を通常の方法でスキャンするか、索引式を仮想列の式としてスキャンするかを選択できます。

ノート:

  • マテリアライズド・ビューではなく、仮想列を利用する利点は、索引を構築できることと、オプティマイザ用に統計情報を取得できることです。

  • 表ごとの仮想列の数は、初期化パラメータMAX_COLUMNSの値によって制限されます。デフォルトでは、その値は最大1000列を意味するSTANDARDです。『Oracle Databaseリファレンス』MAX_COLUMNSに関する項を参照してください。

ノート:

JSONデータ型の1つ以上の列を含む表には、このような各列に対する追加の非表示仮想列があります。これには、SYS_IME_OSON_で始まるシステム生成の名前があります。仮想であるため、領域は使用されません。

この非表示列は、データがIM列ストアにロードされるときに使用され、インメモリー・パフォーマンスを最適化します。describeコマンドの使用時にはリストされず、SELECT *問合せの影響を受けません。ただし、USER_TAB_COLSなどのディクショナリ・ビューを問い合せる場合にはリストされます。

JSONデータをインメモリーで使用するための前提条件

JSONデータでIM列ストアのメリットを利用するためには、次のすべての項目を満たす必要があります。

  • データベースの互換性が12.2.0.0以上である。全文サポートの場合は、20以上である必要があります。

  • Oracleインスタンスのスタートアップ構成ファイルで、max_string_sizeの値が'extended'に設定されている必要がある。

  • IM列ストアに対して、十分なSGAメモリーが構成されている必要がある。

  • JSON列を格納する表領域、表またはマテリアライズド・ビューが、CREATEまたはALTERの文でキーワードINMEMORYを使用してIM列ストアに移入できるように、DBAで指定されている。

  • 次のように初期化パラメータが設定されている。

    • INMEMORY_EXPRESSIONS_USAGEが、STATIC_ONLYまたはENABLEになっている。

      ENABLEをPL/SQLプロシージャDBMS_INMEMORY.ime_capture_expressionsと組み合せて使用すると、動的な式のインメモリー・マテリアライズが可能になります。

    • INMEMORY_VIRTUAL_COLUMNSENABLEになっている。これは、IM列ストアがすべての仮想列を移入することを意味します。(デフォルト値はMANUAL。)

  • JSONデータを格納する列は、整形式のJSONデータが含まれていることが認識されている必要があります。これは、列のデータ型がJSONである場合、またはis jsonチェック制約がある場合です。

各初期化パラメータの値は、SHOW PARAMETERコマンドを使用して確認できます。(データベース・ユーザーSYSまたはそれと同等のユーザーとしてログインしている必要があります。)たとえば:

SHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS

関連項目:

パラメータINMEMORY_VIRTUAL_COLUMNSの詳細は、Oracle Databaseリファレンス