30.1 JSONデータの索引付けの概要

関数ベースの索引を使用して、JSONデータ内の特定のスカラー値を索引付けできます。非定型の構造的問合せおよび全文問合せ用に、JSON検索索引を使用して通常の方法でJSONデータを索引付けできます。

同様に、関数ベースの索引付けは、特定の関数を対象とする問合せに適していますが、これは、SQL/JSONファンクションのコンテキストでは特定のSQL/JSONパス式を意味します。この索引付けは、非定型(つまり、任意)の問合せの場合はあまり役に立ちません。関数ベースの索引を定義するのは、特定のパス式を何度も問い合せることがわかっている場合にしてください。

JSONデータの格納に使用するSQLデータ型に関係なく、SQL/JSONファンクションjson_value問合せにBツリーまたはビットマップ関数ベースの索引を使用できます。このような索引は、単一のスカラーJSON値を対象とします。関数で想定される値の数が少ない場合は、常にビットマップ索引が適しています。たとえば、対象となる値が少数であると予想される場合は、json_valueのためにビットマップ索引を使用できます。

JSON型として格納されるJSONデータの場合、SQL/JSON条件json_exists複数値関数ベースの索引を使用できます。このような索引は、スカラーJSON値を個別に、または(特に)JSON配列の要素として対象にします。

複数値索引は単一のスカラー値に索引付けできますが、このような値を対象とするパス式が予想される場合は、Bツリー索引またはビットマップ索引を使用する方がパフォーマンスが高くなります。特に、スカラー値の配列を対象にする予定のパス式に索引を付けるには、複数値索引を使用します。

フィルタ式が含まれたSQL/JSONパス式は、ファンクション・ベースの索引を選択する問合せで使用できます。ただし、ファンクション・ベースの索引を定義するために使用するパス式には述語を含めることができません。

非定型方式で問い合せる場合は、JSON検索索引を定義してください。これは、一般的索引であり、特定のパス式の対象ではありません。これは、構造問合せ(特定の値を持つJSONフィールドを検索する場合など)や、Oracle SQL条件json_textcontainsを使用した全文問合せ(様々な文字列値から特定の単語を検索する場合など)に適しています。

同じJSON列に対して関数ベースの索引とJSON検索索引を定義することもできます。

JSON検索索引は、JSONデータでの使用に特化して設計されたOracle Text (全文)索引です。

ノート:

データベース文字セットとしてAL32UTF8を使用することをお薦めします。索引の作成または適用時に、文字セットの自動変換が行われる場合があります。このような変換では情報が失われる可能性があります。これは、問合せで戻されることが予測されるデータが、戻されない場合があることを意味します。JSONデータの文字セットおよび文字エンコーディングを参照してください。

静的ディクショナリ・ビューDBA_JSON_INDEXESALL_JSON_INDEXESおよびUSER_JSON_INDEXESでは、それぞれ、データベース内のJSONデータに対するすべての索引、それらのうち現在のユーザーがアクセスできるすべて、およびそれらのうち現在のユーザーが所有しているすべてが示されます。

コンポジット索引の場合、静的ディクショナリ・ビューDBA_TABLE_VIRTUAL_COLUMNSALL_TABLE_VIRTUAL_COLUMNSおよびUSER_TABLE_VIRTUAL_COLUMNSが、索引付け用に自動的に作成される仮想列に関する情報を提供します。*_JSON_INDEXESビューを補足します。