3 SODA索引付けの概要
SODA QBEのパフォーマンスは、索引を使用することによって改善されることがあります。より高速な照合のために特定のQBEパターンを索引付けする方法を指定するJSONオブジェクトである索引仕様を使用してSODA索引を定義します。
{"dateField" : {"$date" : DATE-STRING}}
などの問合せをよく使用するものとします。DATE-STRING
はSODAによってサポートされているISO 8601形式の文字列です。ここで、項目メソッド$date
が、DATE-STRING
をデータ型DATE
のSQL値に変換します。一般に、Bツリー索引を作成することによって、"dateField"
などのフィールドに対する問合せのパフォーマンスを向上させることができます。
または、GeoJSONジオメトリ・オブジェクトの空間データを問い合せるとします。このデータのSODA空間索引を作成すると、このような問合せのパフォーマンスを改善できます。
または、QBE演算子$contains
を使用した全文問合せを実行できるようにするものとします。このような問合せは、データのJSON検索索引を作成することで有効にできます。
または、JSONデータ・ガイドに対してメタデータ問合せを実行するものとします。このガイドは、一連のJSONドキュメントに関する構造および型の情報の要約です。このようなデータガイド情報を保持して自動的に更新するJSON検索索引を作成できます。
このような場合のすべてにおいて、SODA索引仕様を作成し、それを使用して指定された索引を作成することによって、必要な索引を指定します。
索引付けをサポートする各SODA実装に、索引を作成する方法が用意されています。それらはすべて、SODA索引仕様を使用して、作成される索引を定義します。たとえば、SODA for RESTでは、HTTP POSTリクエストを使用して、URI引数action=index
を渡してPOST本体に索引仕様を提供します。
ノート:
-
Bツリー索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。
DATE
またはTIMESTAMP
値に索引付けするBツリー索引を作成するには、Oracle Databaseリリース18c (18.1)以上が必要です。 -
空間索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。
-
検索索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。
例3-1 Bツリー索引の指定
この例では、数値フィールドaddress.zip
に一意でないBツリー索引を指定します。
{ "name" : "ZIPCODE_IDX",
"fields" : [ { "path" : "address.zip",
"datatype" : "number",
"order" : "asc" } ] }
これは、例2-1および例2-2のパスaddress.zip
のフィールドに索引付けします。
例2-3にはそのようなフィールドがないため、索引付け中にドキュメントはスキップされます。
索引仕様にscalarRequired : true
を含めることで、索引ではすべての索引付けされたフィールドがスカラーである必要があることを指定できます。
{ "name" : "ZIPCODE_IDX",
"fields" : [ { "path" : "address.zip",
"datatype" : "number",
"order" : "asc" } ],
"scalarRequired" : true }
仕様にscalarRequired : true
が含まれている場合や、指定されたフィールドの1つ以上(この場合はaddress.zip
のみ)がないドキュメントがコレクションに含まれている場合またはそのいずれかに非スカラー値が含まれている場合は、索引の作成時にエラーが発生します。さらに、このような索引が存在する場合に索引付けされたフィールドのいずれかがないドキュメントを書き込もうとすると、書込み操作に対してエラーが発生します。
scalarRequired
の値に関係なく、ターゲット・フィールドを持つが、指定されたデータ型に変換できない値を持つドキュメントを記述しようとすると、エラーが発生します。たとえば、例3-1で定義した索引の場合、ドキュメントにaddress.zip
フィールドは含まれているが、フィールド値が数値に変換できない場合、エラーが発生します。たとえば、値がオブジェクトであるzip
フィールドの場合が、これに該当します。
例3-2 空間索引の指定
この例では、LOCATION_LONG_LAT_IDX
という名前のOracle Spatial and Graph索引を指定します。これは、ドキュメント内のフィールドlocation
の値であるGeoJSONジオメトリ・オブジェクトを索引付けします。
{ "name" : "LOCATION_LONG_LAT_IDX",
"spatial" : "location" }
この索引仕様は、値がGeoJSONジオメトリ・オブジェクトであるlocation
フィールドがあるすべてのドキュメントにのみ適用されます。次に、Point
タイプのジオメトリ・オブジェクトを持つ、このようなlocation
フィールドがあるオブジェクトの例を示します。
{ "location" : { "type" : "Point",
"coordinates" : [ 33.7243, 118.1579 ] } }
そのlocation
の値は、GeoJSONジオメトリ・オブジェクトであるため、索引付けされます。
索引仕様にscalarRequired : true
もlax : true
も指定されていないため、location
フィールドのないドキュメントは、索引付け中に暗黙的にスキップされます(索引付けされません)。
また、location
値がGeoJSONジオメトリ・オブジェクトではない、次のいずれかのようなオブジェクトがあるドキュメントが問合せ対象のコレクションに含まれる場合、索引付け中にエラーが発生します。
{ "location" : [ 33.7243, 118.1579 ] }
{ "location" : "1600 Pennsylvania Ave NW, Washington, DC 20500" }
また、そのような索引が存在し、そのような非ジオメトリ値を持つlocation
フィールドがあるドキュメントを記述しようとすると、書込み操作に対してエラーが発生します。
索引仕様にscalarRequired : true
を含めることで、索引ではすべての索引付けされたフィールドがスカラーである必要があることを指定できます。
{ "name" : "LOCATION_LONG_LAT_IDX",
"spatial" : "location",
"scalarRequired" : true }
scalarRequired = true
を使用すると、location
フィールドのないドキュメントがコレクションに含まれている場合、索引作成時にエラーが発生します。さらに、このような索引が存在する場合に、索引付けされたフィールド(location
)のないドキュメントを書き込もうとすると、書込み操作のエラーが発生します。(値がジオメトリ・オブジェクトではないlocation
フィールドの場合も、索引作成または書込み操作に対してエラーが発生する必要があります。)
あるいは、索引仕様にlax : true
を含めることで、索引では索引付けされたフィールドが存在し、GeoJSONジオメトリ値を持っている必要がないことを指定できます。
{ "name" : "LOCATION_LONG_LAT_IDX",
"spatial" : "location",
"lax" : true }
lax = true
を使用すると、location
フィールドがないドキュメント、またはGeoJSONジオメトリ・オブジェクトではないlocation
フィールド値({"location" : [33.7243, 118.1579]}
)を持つドキュメントに対してエラーは発生しません。索引はそのようなドキュメントを単に無視します。
ノート:
値がGeoJSON geometry
オブジェクトであるフィールドに対してSODA空間索引を作成しており、そのフィールドをターゲットとするQBEを使用するとき、索引とQBEの両方がそのフィールドに対して同じエラー処理動作を指定している場合には、QBEに対してのみの索引を選択できます。どちらにも、次のうち同じものを指定する必要があります。
-
scalarRequired : true
-
lax : true
-
scalarRequired : true
もlax : true
も指定しない
例3-3 JSON検索索引の指定
この例では、JSON検索索引を指定しています。索引は、次の両方の処理を実行します。
-
JSONドキュメントに非定型のフルワードおよびフル数値の問合せを実行できます。
-
JSONドキュメントに関する集計構造情報および型情報を自動的に蓄積し、更新します。
{ "name" : "SEARCH_AND_DATA_GUIDE_IDX" }
この索引仕様は同等です。これは、単にデフォルト値を明示的に設定します。
{ "name" : "SEARCH_AND_DATA_GUIDE_IDX",
"dataguide" : "on",
"search_on" : "text_value" }
関連項目:
-
SQLを使用して
json_value
Bツリー索引を作成する方法の詳細は、Oracle Database JSON開発者ガイドを参照 -
Oracle Spatial and Graph索引の詳細は、Oracle Spatial and Graph開発者ガイドを参照してください。
-
JSON検索索引の詳細は、Oracle Database JSON開発者ガイドを参照
関連トピック