我在 Oracle 中遇到了一个非常奇怪的行为查询本身是巨大的而且非常复杂......但每次运行它时基本上都是一样的。但是,当返回较小的结果集时,它似乎执行得更慢。我能给出的最好的例子是,如果我在上面设置这个过滤器,
and mgz_query.IsQueryStatus(10001,lqo.query_id)>0
它返回 12,429 条记录中的 960 条,我看到执行时间约为 1.9 秒。但是,如果我将过滤器更改为
and mgz_query.IsQueryStatus(10005,lqo.query_id)>0
它返回 12,429 条记录中的 65 条,我看到执行时间约为 6.8 秒。当深入挖掘时,我发现较小的结果集似乎比较大的结果集执行了更多的缓冲区获取。这对我来说似乎完全违反直觉。
正在运行的查询大约有 8000 个字符长(除非有人想要它,否则我不会将这篇文章与整个查询混为一谈),包括 4 个“Union All”语句,但主要过滤索引并且很漂亮高效,除了其庞大的规模。
使用中的过滤器通过以下函数执行。
Function IsQueryStatus(Pni_QueryStateId in number,
Pni_Query_Id in number) return pls_integer as
vn_count pls_integer;
Begin
select count(1)
into vn_count
from m_query mq
where mq.id = Pni_Query_Id
and mq.state_id = Pni_QueryStateId;
return vn_count;
End;
关于可能导致较小结果集的性能比大结果集差得多的任何想法?