首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文:在json上创建索引,Json项目长度太长吗?

甲骨文:在json上创建索引,Json项目长度太长吗?
EN

Database Administration用户
提问于 2016-09-09 14:04:54
回答 1查看 599关注 0票数 2

我试图创建一个索引,一个clob字段。有没有人知道极限是什么。我有多达20万份。长度json记录

谢谢你的建议。

代码语言:javascript
复制
CREATE INDEX emul_full_idx ON CDP_emultimedia (JsonData)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)')
SQL> /
CREATE INDEX emul_full_idx ON CDP_emultimedia (JsonData)

ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50850: ORA-06515: PL/SQL: unhandled exception JSON item length is too long
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366
EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-09-09 15:05:33

我找不到对此的任何官方引用,但通过实验,我发现超过32K的JSON记录值会触发此错误。

也许在以后的版本中会修复这个问题,就像这个类似的bug一样,也就是12.2 (这个bug是关于让JSON识别超过64个字节,而不是这个错误):

使用DRG-50850创建JSON索引失败(Doc 2110588.1)

在此之前,我会尝试使用更短的记录,或者打开服务请求。

而实验:

代码语言:javascript
复制
CREATE TABLE tj  (js CLOB  CONSTRAINT c_js CHECK (js IS JSON));

我可以轻松地为“大型”(超过200 K字符) JSON文档创建索引,因此首先创建一个包含大量(50000)短(2个字符)记录的JSON:

代码语言:javascript
复制
declare
  c clob;
begin
  c := '{';

  for i in 1..50000
  loop
    c := c || to_clob('"Attr') || to_clob(i) || to_clob('" : "') || lpad(to_clob('X'), 2, 'X') || to_clob('",');
  end loop;

  c := c || '"End" : 0 }';

  insert into tj values (c);
end;
/

这个JSON的长度是:

代码语言:javascript
复制
select dbms_lob.getlength(js) from tj;

DBMS_LOB.GETLENGTH(JS)
----------------------
                938906

创建索引:

代码语言:javascript
复制
SQL> CREATE INDEX tj_i1 ON tj (js)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');

Index created.

现在尝试一个具有1条长记录的JSON:

代码语言:javascript
复制
SQL> truncate table tj;

Table truncated.

SQL> drop index tj_i1;

Index dropped.

declare
  c clob;
begin
  c := '{';

  for i in 1..1
  loop
    c := c || to_clob('"Attr') || to_clob(i) || to_clob('" : "') || lpad(to_clob('X'), 32800, 'X') || to_clob('",');
  end loop;

  c := c || '"End" : 0 }';

  insert into tj values (c);
end;
/

所以我们的JSON有一个很长的记录,总的长度是:

代码语言:javascript
复制
select dbms_lob.getlength(js) from tj;

DBMS_LOB.GETLENGTH(JS)
----------------------
                 32825

现在创建索引:

代码语言:javascript
复制
SQL> CREATE INDEX tj_i1 ON tj (js)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');

CREATE INDEX tj_i1 ON tj (js)
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50850: ORA-06515: PL/SQL: unhandled exception JSON item length is too long
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366

当低于32K的限制时,同样的效果是:

代码语言:javascript
复制
SQL> truncate table tj;

Table truncated.

SQL> drop index tj_i1;

Index dropped.

declare
  c clob;
begin
  c := '{';

  for i in 1..1
  loop
    c := c || to_clob('"Attr') || to_clob(i) || to_clob('" : "') || lpad(to_clob('X'), 32700, 'X') || to_clob('",');
  end loop;

  c := c || '"End" : 0 }';

  insert into tj values (c);
end;
/

长度和索引:

代码语言:javascript
复制
select dbms_lob.getlength(js) from tj;

DBMS_LOB.GETLENGTH(JS)
----------------------
                 32725

CREATE INDEX tj_i1 ON tj (js)
INDEXTYPE IS CTXSYS.CONTEXT
  3  PARAMETERS ('section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');

Index created.
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/149217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档