JSONデータの索引付け
索引がJSON索引であるのは、JSONデータ内に含まれるフィールドを1つ以上索引付けしている場合です。
JSONにはスキーマがないため、表の行によってJSONデータの型が異なる場合があります。ただし、JSONデータを索引付けするときには、表のすべての行でデータ型が同じである必要があります。そうでない場合、索引の作成は失敗します。さらに、1つ以上のJSON索引が作成された後で、誤った型のデータを書き込もうとすると失敗します。
前述の制限を除いて、JSONデータの索引付けとJSON索引の操作は、JSON以外のデータの索引付けとほぼ同様に行われます。索引を作成するには、ドット表記法を使用してJSONフィールドへのパスを指定します。AS
キーワードを使用して、データの型を指定する必要もあります。
次の例は、JSONの操作で示した例に基づいています。
sql-> create index idx_json_income on JSONPersons (person.income
as integer);
Statement completed successfully
sql-> create index idx_json_age on JSONPersons (person.age as integer);
Statement completed successfully
sql->
その後、通常の方法で問合せを実行できます。このとき、索引idx_json_incomeが自動的に使用されます。ただし、この章の冒頭(基本的な索引付け)で示したように、問合せプロセッサでは使用する索引が認識されません。特定の索引の使用を必須にするには、通常どおりに索引ヒントを指定します。
sql-> SELECT /*+ FORCE_INDEX(JSONPersons idx_json_income) */ *
from JSONPersons j WHERE j.person.income > 10000000 and
j.person.age < 40;
> Row 0
+-----------+---------------------------------------------+
| id | 3 |
+-----------+---------------------------------------------+
| person | address |
| | city | Middleburg |
| | phones |
| | areacode | 305 |
| | number | 1234079 |
| | type | work |
| | |
| | areacode | 305 |
| | number | 2066401 |
| | type | home |
| | state | FL |
| | street | 187 Aspen Drive |
| | age | 38 |
| | connections |
| | 1 |
| | 4 |
| | 2 |
| | expenses |
| | food | 2000 |
| | gas | 10 |
| | travel | 700 |
| | firstname | John |
| | income | 100000000 |
| | lastLogin | 2016-11-29T08:21:35.4971 |
| | lastname | Morgan |
+-----------+---------------------------------------------+
1 row returned
sql->
最後に、JSONマップで複数キー索引を作成する場合は、.keys()
式に型を指定しないでください。これは、型は常にString
であるためです。ただし、.values()
式には型宣言が必要です。
sql-> create index idx_json_expenses on JSONPersons
(person.expenses.keys(), person.expenses.values() as integer);
Statement completed successfully
sql-> SELECT * FROM JSONPersons j WHERE j.person.expenses.food > 1000;
> Row 0
+-----------+---------------------------------------------+
| id | 2 |
+-----------+---------------------------------------------+
| person | address |
| | city | Beloit |
| | phones |
| | areacode | 339 |
| | number | 1684972 |
| | type | home |
| | state | WI |
| | street | 187 Hill Street |
| | zipcode | 53511 |
| | age | 35 |
| | connections |
| | 1 |
| | 3 |
| | expenses |
| | books | 100 |
| | food | 1700 |
| | travel | 2100 |
| | firstname | John |
| | income | 100000 |
| | lastLogin | 2016-11-28T13:01:11.2088 |
| | lastname | Anderson |
+-----------+---------------------------------------------+
> Row 1
+-----------+---------------------------------------------+
| id | 3 |
+-----------+---------------------------------------------+
| person | address |
| | city | Middleburg |
| | phones |
| | areacode | 305 |
| | number | 1234079 |
| | type | work |
| | |
| | areacode | 305 |
| | number | 2066401 |
| | type | home |
| | state | FL |
| | street | 187 Aspen Drive |
| | age | 38 |
| | connections |
| | 1 |
| | 4 |
| | 2 |
| | expenses |
| | food | 2000 |
| | gas | 10 |
| | travel | 700 |
| | firstname | John |
| | income | 100000000 |
| | lastLogin | 2016-11-29T08:21:35.4971 |
| | lastname | Morgan |
+-----------+---------------------------------------------+
> Row 2
+-----------+---------------------------------------------+
| id | 4 |
+-----------+---------------------------------------------+
| person | address |
| | city | Leominster |
| | phones |
| | areacode | 339 |
| | number | 4120211 |
| | type | work |
| | |
| | areacode | 339 |
| | number | 8694021 |
| | type | work |
| | |
| | areacode | 339 |
| | number | 1205678 |
| | type | home |
| | null |
| | |
| | areacode | 305 |
| | number | 8064321 |
| | type | home |
| | state | MA |
| | street | 364 Mulberry Street |
| | age | 38 |
| | connections |
| | 3 |
| | 5 |
| | 1 |
| | 2 |
| | expenses |
| | books | 240 |
| | clothes | 2000 |
| | food | 6000 |
| | shoes | 1200 |
| | firstname | Peter |
| | income | 80000 |
| | lastLogin | 2016-10-19T09:18:05.5555 |
| | lastname | Smith |
+-----------+---------------------------------------------+
3 rows returned
sql->
非JSONの複数キー索引に適用されるその他すべての制約は、JSONの複数キー索引にも適用されることに注意してください。