dbms_lob.instr需要很长时间才能获取数据

时间:2017-06-13 13:29:19

标签: sql oracle performance clob

我们将clob数据以XML格式存储在数据库中,数据类型为CLOB。

为了获得这些数据,我们尝试使用以下查询:

select message_xml
  from table
 where dbms_lob.instr(message_xml, 'A12345678') > 0
 order by message_date;

但是这个查询需要花费很长时间才能得到结果。

有没有更好的方法来做到这一点。

请注意,我在Oracle 11g数据库中触发查询。

1 个答案:

答案 0 :(得分:0)

是或否您的问题是一般性的。答案取决于许多因素。 你有两个简单的解决方案,一个更复杂。

1)基于功能的简单指数。仅适用于一个搜索值。

create fb_trivial index on table( dbms_lob.instr(message_xml, 'A12345678'))

并查询以利用此索引

select message_xml
  from table
 where dbms_lob.instr(message_xml, 'A12345678') > 0
 order by message_date;

2)提取函数base-index。

create index fb_extract_index on table(extractvalue(xmltype(message_xml),'/path/to/your/value'))

或带有namaspaces的版本

create index fb_extract_index on table(extractvalue(xmltype(message_xml),'/ns:path/ns:to/ns:your/ns:value', 'xmlns:ns="namespace:from:xml" '))

并查询以利用

select message_xml from table where extractvalue(xmltype(message_xml),'/path/to/your/value')) = 'A12345678'

3)有关更复杂的解决方案,请参阅此文oracle-11g-xmlindex-part-1 和关于xml索引的{oracle文档xmlIndex