Настройка производительности запросов на выборку документов 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)

Куда,

  1. ДЕТАЛИ - Документ JSON
  2. 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, чтобы выбрать из него одно значение.

Из документации Oracle

Другие вопросы по тегам