我试图创建一个索引,一个clob字段。有没有人知道极限是什么。我有多达20万份。长度json记录
谢谢你的建议。
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发布于 2016-09-09 15:05:33
我找不到对此的任何官方引用,但通过实验,我发现超过32K的JSON记录值会触发此错误。
也许在以后的版本中会修复这个问题,就像这个类似的bug一样,也就是12.2 (这个bug是关于让JSON识别超过64个字节,而不是这个错误):
使用DRG-50850创建JSON索引失败(Doc 2110588.1)
在此之前,我会尝试使用更短的记录,或者打开服务请求。
而实验:
CREATE TABLE tj (js CLOB CONSTRAINT c_js CHECK (js IS JSON));我可以轻松地为“大型”(超过200 K字符) JSON文档创建索引,因此首先创建一个包含大量(50000)短(2个字符)记录的JSON:
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的长度是:
select dbms_lob.getlength(js) from tj;
DBMS_LOB.GETLENGTH(JS)
----------------------
938906创建索引:
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:
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有一个很长的记录,总的长度是:
select dbms_lob.getlength(js) from tj;
DBMS_LOB.GETLENGTH(JS)
----------------------
32825现在创建索引:
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的限制时,同样的效果是:
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;
/长度和索引:
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.https://dba.stackexchange.com/questions/149217
复制相似问题