【问题标题】:Oracle : Indexing JSON type column in ORACLE, targeted JSON field may be absent from the data queriedOracle : 在 ORACLE 中索引 JSON 类型列,查询的数据中可能缺少目标 JSON 字段
【发布时间】:2019-08-27 23:13:36
【问题描述】:

我正在尝试在 ORACLE 中包含 JSON 类型数据的列上设置索引。我正在设置数据的字段存在于某些记录中,而其他记录中不存在,基本上该字段是可选的。

我已经在 hibernate 中有查询 id 列表的代码,我想在数据库中对其进行索引,以便搜索高效。

我试过 json_textcontains,不幸的是它只适用于单个值它不适用于列表,我使用 section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT) 策略来创建索引。

我尝试按照 Oracle 的建议使用 ERROR ON ERROR NULL ON EMPTY 在 JSON_VALUE 上设置索引,但当我在搜索中执行 EXPLAIN PLAN 时,它仍然没有显示预期值。

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

PARAMETERS 列中的 json 如下所示:-

{"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 存在于第二条记录中,而第三条记录则存在。因此,当我使用 JPA hibernate 执行 IN 时,从我的代码中,我只提供值为 128,129 的 addressId。

我希望当我查询时我应该在 EXPLAIN PLAN 中看到 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 |
-----------------------------------------------------------------------------------------

非常感谢您到目前为止的阅读,感谢您的意见。

【问题讨论】:

    标签: java oracle hibernate jpa indexing


    【解决方案1】:

    首先,ORACLE OPTIMIZER 将始终在具有 154 行的表上选择 FULL TABLE SCAN。选择索引的条目太少。但是,如果你想使用创建的索引,你必须通过优化器提示来询问:

    SELECT  /*+ INDEX(a PARAM_ADDRESS_ID_INDX)*/ *
    FROM EMPLOYEE_INFORMATION a
    WHERE ......
    

    【讨论】:

    • 感谢您的回复。那么这是否意味着一旦我有更多记录,它将开始使用索引?我按照你所说的尝试过,我得到了回复。
    【解决方案2】:

    我在为 VARCHAR2 创建具有更高价值的 INDEX 时遇到了 http://www.dba-oracle.com/t_ora_01450_maximum_key_length_exceeded.htm,它提到 -

    作为一般规则,对非常大的列(raw、long、clob)进行索引是 很少有用,因为优化器几乎总能找到 全表扫描比对长列值调用索引更便宜。

    由于 CLOB 数据是 JSON,我认为返回 VARCHAR2(4000) 不是一个好主意,因为在这种情况下 JSON 的架构不是固定的。因此,对于这个用例来说,创建索引并返回固定长度的 VARCHAR2 作为它的一部分并不理想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多