31.2 JSONデータのインメモリー列ストアへの移入
ALTER TABLE … INMEMORYを使用してJSONデータの列、またはこのような列を含む表をインメモリー列ストア(IM列ストア)に移入すると、JSON問合せのパフォーマンスを向上させることができます。
1つ以上のJSONデータの列を含む表をIM列ストアに移入するように指定するには、表をINMEMORYとしてマークします。例31-1に、これを示します。
列は、(1)データ型がJSONの場合、または(2) VARCHAR2、CLOBまたはBLOB型でis jsonチェック制約がある場合に、整形式のJSONデータのみが含まれていることが保証されます。(JSONデータ型を使用するには、データベース初期化パラメータcompatibleが少なくとも20である必要があります。)
IM列ストアは、32,767バイトより小さい文書の問合せに使用されます。これより大きな文書の問合せでは、IM列ストアを利用するメリットがありません。
ノート:
IM列ストアに移入する表のJSON列が、12.2以降の互換性設定がないデータベースを使用して作成された場合、またはmax_string_sizeがextendedに設定されていなかった場合(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列のデータ型(VARCHAR2、CLOB、BLOBまたはJSON型)に関係なく、OSON形式になります。OSONは、Oracle DatabaseサーバーとOracle Databaseクライアントの両方で問合せおよび更新を迅速に行うための、オラクル社による最適化されたバイナリJSON形式です。
ALTER TABLE … INMEMORYを使用してJSONデータをIM列ストアに移入すると、非定型構造問合せ(つまり、予定していない問合せや定期的に使用しない問合せ)がサポートされます。
列のデータ型がJSONの場合は、ALTER TABLE … INMEMORY TEXTを使用してIM列ストアに移入し、全文検索をサポートできます。(ALTER TABLE … INMEMORYを使用すると、同じJSON列に対してキーワードTEXTを指定するかどうかにかかわらず、非定型問合せと全文問合せの両方がサポートされます。)
ノート:
IM列ストアに移入されるJSON列(任意のデータ型)にJSON検索索引を定義すると、IM列ストアではなく、検索索引がその列の問合せに使用されます。
関連項目:
-
ALTER TABLE...INMEMORYの詳細は、Oracle Database In-Memoryガイド -
全文検索用のIM列ストアのサポートの詳細は、Oracle Database In-Memoryガイド
-
IM列ストアでの、
JSON型としてまたはテキストとして格納されたJSONデータのサポートの詳細は、Oracle Database In-Memoryガイド
例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を使用してデータを検索しようとすると、エラーが発生します。