Oracle JSON文档选择查询性能调优

ctrmrzij  于 2023-01-25  发布在  Oracle
关注(0)|答案(1)|浏览(166)

表格说明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)***

Where,
`

  1. DETAILS - JSON Document
  2. PREMIUM - column is virtual column.
    `
    ``
    如果我使用order by子句选择虚拟列,则查询执行将花费太多时间来运行选择查询。

以下查询花费32.23秒。***PREMIUM***是此处的虚拟列

select id,tx_status,updated_date,tx_user, ***PREMIUM*** from J_MARINE_CERT j order by j.UPDATED_DATE desc

删除***PREMIUM***后,需要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)来执行。

anauzrmj

anauzrmj1#

我遇到了同样的问题,唯一好的解决方案是为来自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文档

相关问题