Oracle: индексирование столбца типа JSON в ORACLE, целевое поле JSON может отсутствовать в запрашиваемых данных - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь настроить индекс для столбца в ORACLE, который имеет данные типа JSON.Поле, в котором я настраиваю данные, присутствует в одних записях и отсутствует в других, в основном это поле является необязательным.

У меня уже есть код в hibernate, который запрашивает список идентификаторов, я хочу проиндексировать его в базе данных, чтобы поиск был эффективным.

Я пытался json_textcontains ,к сожалению, он работает только для одного значения, он не работает для списка, я использовал стратегию группы разделов CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT) для создания индекса.

Я попытался настроить индекс для JSON_VALUEс ERROR ON ERROR NULL ON EMPTY , как рекомендовано Oracle, он все еще не показывает ожидаемые значения, когда я выполняю EXPLAIN PLAN при поиске.

CREATE INDEX PARAM_ADDRESS_ID_INDX ON EMPLOYEE_INFORMATION(
  JSON_VALUE(PARAMETERS, '$.addressId' RETURNING VARCHAR2(4000) ERROR ON ERROR NULL ON EMPTY)
);

JSON внутри столбца PARAMETERS выглядит какпоказано ниже: -

{"type":"home","addressId":128,"description":"This is test address 1"}
{"type":"away","referenceId":3341,"description":"Test away description"}
{"type":"away","addressId":129,"description":"This is test address 2"}

Как вы можете видеть в первой записи, addressId присутствует во второй его нет, а в третьей ее присутствует.Таким образом, из моего кода, когда я делаю IN с использованием спящего режима JPA, я просто предоставляю addressIds со значениями 128,129.

Я ожидаю, что когда я сделаю запрос, я увижу информацию INDEX в ПЛАНЕ ОБЪЯСНЕНИЯ, но вместо этого я увижу ниже: -

-----------------------------------------------------------------------------------------
| Id  | Operation         | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                     |   154 |   109K| 11864   (1)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMPLOYEE_INFORMATION|   154 |   109K| 11864   (1)| 00:00:01 |
-----------------------------------------------------------------------------------------

Большое спасибо за чтение, оцените ваши входные данные.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Прежде всего, ORACLE OPTIMIZER всегда выбирает FULL TABLE SCAN для таблицы с 154 строками. Слишком мало записей для выбора индекса. Но если вы хотите использовать созданный индекс, вы должны задать это с подсказками оптимизатора:

SELECT  /*+ INDEX(a PARAM_ADDRESS_ID_INDX)*/ *
FROM EMPLOYEE_INFORMATION a
WHERE ......
0 голосов
/ 07 апреля 2019

Я сталкивался с http://www.dba -oracle.com / t_ora_01450_maximum_key_length_exceeded.htm при создании INDEX с более высоким значением для VARCHAR2, он упоминает -

Как правило, индексациядля очень больших столбцов (raw, long, clob) редко бывает полезным, поскольку оптимизатор почти всегда найдет сканирование полной таблицы дешевле, чем вызов индекса для значения длинного столбца.

Поскольку данные CLOBэто JSON, я думаю, что не стоит возвращать VARCHAR2 (4000), поскольку схема для JSON в этом случае не исправлена.Следовательно, для этого варианта использования не идеально создавать индекс и возвращать фиксированную длину VARCHAR2 как его часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...