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

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

1つ以上のJSONデータの列を含む表をIM列ストアに移入するように指定するには、表をINMEMORYとしてマークします。例31-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列ストアではなく、検索索引がその列の問合せに使用されます。

関連項目:

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

SELECT COUNT(1) FROM j_purchaseorder
  WHERE json_exists(data,
                    '$.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(data,
                    '$.ShippingInstructions?(
                       @.Address.zipCode == 99236)');

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

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

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

ALTER TABLE j_purchaseorder INMEMORY TEXT (data);

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