28 インメモリーJSONデータ

問合せのパフォーマンスを向上させるために、JSONデータの列をインメモリー列ストア(IM列ストア)に格納できます。

28.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列ストアに仮想列として自動的にロードされます。オプティマイザは、推定されるコストに基づいて、関数ベースの索引を通常の方法でスキャンするか、索引式を仮想列の式としてスキャンするかを選択できます。

注意:

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

  • 仮想列には、一般的な列と同様に、1つの特定の表に対して1000列の制限があります。

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

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

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

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

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

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

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

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

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

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

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

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

SHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS

関連項目:

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

28.2 JSONデータのインメモリー列ストアへの移入

ALTER TABLEINMEMORYを使用してJSONデータの列、またはこのような列を含む表をインメモリー列ストア(IM列ストア)に移入すると、JSON問合せのパフォーマンスを向上させることができます。

1つ以上のJSONデータの列を含む表をIM列ストアに移入するように指定するには、表をINMEMORYとしてマークします。例28-1に、これを示します。

列は、(1)データ型がJSONの場合、または(2) VARCHAR2CLOBまたはBLOB型でis jsonチェック制約がある場合に、整形式のJSONデータのみが含まれていることが保証されます。(JSONデータ型を使用するには、データベース初期化パラメータcompatibleが少なくとも20である必要があります。)

IM列ストアは、32,767バイトより小さい文書の問合せに使用されます。これより大きな文書の問合せでは、IM列ストアを利用するメリットがありません。

注意:

IM列ストアに移入する表のJSON列が、12.2以降の互換性設定がないデータベースを使用して作成された場合、またはmax_string_sizeextendedに設定されていなかった場合(Oracle Database 12c リリース2 (12.2.0.1)より前の場合などに該当)は、まず、スクリプトrdbms/admin/utlimcjson.sqlを実行する必要があります。これは、JSON列が含まれる既存の表すべてで、リリース12.2.0.1で追加されたインメモリーのJSON処理を利用できるように準備します。インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレードを参照してください。

JSON列が含まれる表をINMEMORYにすると、各JSON列についてインメモリーの仮想列がその表に追加されます。対応する仮想列は、特定のJSON列の問合せに使用されます。仮想列には対応するJSON列と同じJSONデータが含まれていますが、JSON列のデータ型(VARCHAR2CLOBBLOBまたはJSON型)に関係なく、OSON形式になります。OSONは、Oracle DatabaseサーバーとOracle Databaseクライアントの両方で問合せおよび更新を迅速に行うための、オラクル社による最適化されたバイナリJSON形式です。

ALTER TABLEINMEMORYを使用してJSONデータをIM列ストアに移入すると、非定型構造問合せ(つまり、予定していない問合せや定期的に使用しない問合せ)がサポートされます。

列のデータ型がJSONの場合は、ALTER TABLEINMEMORY TEXTを使用してIM列ストアに移入し、全文検索をサポートできます。(ALTER TABLEINMEMORYを使用すると、同じJSON列に対してキーワードTEXTを指定するかどうかにかかわらず、非定型問合せと全文問合せの両方がサポートされます。)

注意:

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

関連項目:

例28-1 非定型問合せのサポートのためのIM列ストアへのJSONデータの移入

SELECT COUNT(1) FROM j_purchaseorder
  WHERE json_exists(po_document,
                    '$.ShippingInstructions?(@.Address.zipCode == 99236)');

-- The execution plan shows: TABLE ACCESS FULL


-- Specify table as INMEMORY, with default PRIORITY setting of NONE,
-- so it is populated only when a full scan is triggered.

ALTER TABLE j_purchaseorder INMEMORY;

-- Query the table again, to populate it into the IM column store.
SELECT COUNT(1) FROM j_purchaseorder
  WHERE json_exists(po_document,
                    '$.ShippingInstructions?(@.Address.zipCode == 99236)');

-- The execution plan for the query now shows: TABLE ACCESS INMEMORY FULL

例28-2 全文問合せのサポートのためのIM列ストアへのJSON型の列の移入

この例では、全文サポートのために、j_purchaseorder表のpo_document列をIM列ストアに移入します(キーワードTEXT)。

ALTER TABLE j_purchaseorder INMEMORY TEXT (po_document);

po_document列がJSONデータ型ではなく、列にJSON検索索引が定義されていない場合、JSON全文問合せはサポートされません。その場合、json_textcontainsを使用してデータを検索しようとすると、エラーが発生します。

28.3 インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレード

12.2以降の互換性設定のないデータベースmax_string_size = extendedが設定されなかったデータベースを使用して作成されたJSON列が含まれる表は、インメモリー列ストア(IM列ストア)に移入する前にアップグレードする必要があります。これを行うには、スクリプトrdbms/admin/utlimcjson.sqlを実行します。

スクリプトrdbms/admin/utlimcjson.sqlを実行すると、JSON列が含まれるすべての既存の表が、IM列ストアに移入できるようにアップグレードされます。これを使用するには、次の項目のすべてを満たす必要があります。

  • データベース・パラメータcompatible12.2.0.0以上に設定する必要がある。

  • データベース・パラメータmax_string_sizeextendedに設定されている必要がある。

  • アップグレードするJSON列は、整形式のJSONデータが含まれていることが認識されている必要があります。これは、JSONデータ型の列脚注1の場合、またはis jsonチェック制約が定義されているJSON型以外の列がある場合です。



脚注の凡例

脚注1: JSONデータ型を使用するには、データベース初期化パラメータcompatibleが少なくとも20である必要があります。