28 インメモリーJSONデータ
問合せのパフォーマンスを向上させるために、JSONデータの列をインメモリー列ストア(IM列ストア)に格納できます。
- インメモリーJSONデータの概要
JSONデータをインメモリー列ストア(IM列ストア)に移入すると、非定型問合せおよび全文問合せのパフォーマンスを向上させることができます。 - JSONデータのインメモリー列ストアへの移入
ALTER TABLE
…INMEMORY
を使用してJSONデータの列、またはこのような列を含む表をインメモリー列ストア(IM列ストア)に移入すると、JSON問合せのパフォーマンスを向上させることができます。 - インメモリー列ストアで使用するための、JSONデータが格納された表のアップグレード
12.2以降の互換性設定のないデータベースか、max_string_size = extended
が設定されなかったデータベースを使用して作成されたJSON列が含まれる表は、インメモリー列ストア(IM列ストア)に移入する前にアップグレードする必要があります。これを行うには、スクリプトrdbms/admin/utlimcjson.sql
を実行します。
親トピック: JSON用のパフォーマンス・チューニング
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_table
、json_query
、json_value
、json_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_COLUMNS
がENABLE
になっている。これは、IM列ストアがすべての仮想列を移入することを意味します。(デフォルト値はMANUAL
。)
-
-
JSONデータを格納する列は、整形式のJSONデータが含まれていることが認識されている必要があります。これは、列のデータ型が
JSON
である場合、またはis json
チェック制約がある場合です。
各初期化パラメータの値は、SHOW PARAMETER
コマンドを使用して確認できます。(データベース・ユーザーSYS
またはそれと同等のユーザーとしてログインしている必要があります。)次に例を示します。
SHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS
関連項目:
パラメータINMEMORY_VIRTUAL_COLUMNS
の詳細は、Oracle Databaseリファレンス
親トピック: インメモリーJSONデータ
28.2 JSONデータのインメモリー列ストアへの移入
ALTER TABLE
… INMEMORY
を使用してJSONデータの列、またはこのような列を含む表をインメモリー列ストア(IM列ストア)に移入すると、JSON問合せのパフォーマンスを向上させることができます。
1つ以上のJSONデータの列を含む表をIM列ストアに移入するように指定するには、表をINMEMORY
としてマークします。例28-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ガイド
例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列ストアに移入できるようにアップグレードされます。これを使用するには、次の項目のすべてを満たす必要があります。
-
データベース・パラメータ
compatible
を12.2.0.0
以上に設定する必要がある。 -
データベース・パラメータ
max_string_size
がextended
に設定されている必要がある。 -
アップグレードするJSON列は、整形式のJSONデータが含まれていることが認識されている必要があります。これは、
JSON
データ型の列脚注1の場合、またはis json
チェック制約が定義されているJSON
型以外の列がある場合です。
関連項目
親トピック: インメモリーJSONデータ
脚注の凡例
脚注1:JSON
データ型を使用するには、データベース初期化パラメータcompatible
が少なくとも20
である必要があります。