Настройка производительности запросов на выборку документов Oracle JSON
Описание таблицы
COLUMN DATA_TYPE NULLABLE DEFAULT_VALUE
ID VARCHAR2(16) No
UPDATED_DATE TIMESTAMP(6) Yes
DETAILS CLOB Yes
TX_STATUS VARCHAR2(10) Yes
TX_USER VARCHAR2(16) Yes
PREMIUM NUMBER(10,2) Yes JSON_VALUE("DETAILS" FORMAT JSON , '$.policy.premium' RETURNING NUMBER(10,2) NULL ON ERROR)
Куда,
- ДЕТАЛИ - Документ JSON
- PREMIUM - столбец является виртуальным столбцом.
Если я выбираю виртуальный столбец с заказом по предложению, выполнение запроса занимает слишком много времени для выполнения запроса выбора.
Приведенный ниже запрос занимает 32,23 сек. ПРЕМИУМ - это виртуальная колонка здесь
select id,tx_status,updated_date,tx_user, PREMIUM from J_MARINE_CERT j order by j.UPDATED_DATE desc
После удаления ПРЕМИУМ принимается 0,009 сек.
select id,tx_status,updated_date,tx_user from J_MARINE_CERT j order by j.UPDATED_DATE desc
Даже после индексации PREMIUM, updated_date, для выполнения требуется одинаковое количество времени (32.23).
1 ответ
У меня была та же проблема, и единственным хорошим решением было создание материализованного представления для значений из json.
CREATE MATERIALIZED VIEW mv_for_query_rewrite
BUILD IMMEDIATE
REFRESH FAST ON STATEMENT WITH PRIMARY KEY
AS SELECT tbl.id, jt.*
FROM jour_table tbl,
json_table(tbl.json_document, '$' ERROR ON ERROR NULL ON EMPTY
COLUMNS (
some_number NUMBER PATH '$.PONumber',
userid VARCHAR2(10) PATH '$.User'
)) jt;
Причина падения производительности в том, что Oracle занимает в памяти весь json, чтобы выбрать из него одно значение.