WHERE 子句中的函数并不慢。但如果您的 IDE 只返回前 N 行,它可能会出现这种情况。
您可能可以使用基于函数的索引来提高性能。
这是示例表和数据。1000 行中只有一个包含“已取消”状态,使其成为索引的良好候选者。
create table events(id number primary key, body clob);
insert into events
select level,
'<Event>
<Description>
<Status>'||
case when mod(level, 1000) = 0 then 'Cancelled' else 'Active' end||
'</Status>
</Description>
</Event>'
from dual connect by level <= 10000;
commit;
begin
dbms_stats.gather_table_stats(user, 'EVENTS');
end;
/
该查询需要 3 秒来执行全表扫描。
SELECT * FROM events
WHERE EXTRACTVALUE(xmltype(body),'/Event/Description/Status') = 'Cancelled';
创建索引更改将计划更改为 INDEX RANGE SCAN,并将时间减少到 0.03 秒。
create index events_fbi on events
(extractValue(xmltype(body), '/Event/Description/Status'));
SELECT * FROM events
WHERE EXTRACTVALUE(xmltype(body),'/Event/Description/Status') = 'Cancelled';