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
を使用してデータを検索しようとすると、エラーが発生します。