Sql Oracle:较小结果集的性能较差?

Sql Oracle:较小结果集的性能较差?,sql,oracle,optimization,Sql,Oracle,Optimization,我在Oracle中遇到了一个非常奇怪的查询行为查询本身非常庞大而且非常复杂…但每次运行时基本上都是一样的。但是,当返回较小的结果集时,它的执行速度似乎较慢。我能举的最好的例子是,如果我在上面设置这个过滤器 and mgz_query.IsQueryStatus(10001,lqo.query_id)>0 它返回12429条记录中的960条,执行时间约为1.9秒。但是,如果我将过滤器更改为 and mgz_query.IsQueryStatus(10005,lqo.query_id)&g

我在Oracle中遇到了一个非常奇怪的查询行为查询本身非常庞大而且非常复杂…但每次运行时基本上都是一样的。但是,当返回较小的结果集时,它的执行速度似乎较慢。我能举的最好的例子是,如果我在上面设置这个过滤器

and mgz_query.IsQueryStatus(10001,lqo.query_id)>0 
它返回12429条记录中的960条,执行时间约为1.9秒。但是,如果我将过滤器更改为

and mgz_query.IsQueryStatus(10005,lqo.query_id)>0
返回12429条记录中的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;

关于是什么原因导致较小的结果集的性能比较大的结果集差得多,您有什么想法吗?

我认为您面临的情况是,确定某个东西不在该集中比确定它是否在该集中花费的时间要长得多。这种情况经常发生。例如,如果在<代码> MyQualid(ID)上有索引,那么考虑< <代码>如何在子句中执行:

(1) 在索引中查找值
Pni\u Query\u Id
。没有对手。使用值
0
完成查询

(2) 有一堆火柴。现在,让我们获取
state\u id
所在的页面,并与
Pni\u QueryStateId
进行比较。哦,那是更多的工作

如果是这种情况,那么在
m\u query(id,state\u id)
上建立索引应该有助于查询


顺便说一下,这是假设唯一的变化是
where
子句中的函数调用。如果有其他更改以获得更少的行,您可能只需要调用此函数更少的次数。

是的,这正是问题所在……非常感谢,我没有考虑排除可能需要更长时间的问题。