Performance Oracle select:获取总行数的最快方法

Performance Oracle select:获取总行数的最快方法,performance,oracle,select,count,resultset,Performance,Oracle,Select,Count,Resultset,我正在执行一个SQL查询,它扫描两个具有数百万行的表。 我试图实现的是,只有当结果集只包含一行时,select查询才应该返回结果。 我知道这两种方法: 1使用分组依据,然后使用“计数*” 2使用内部查询,进一步使用“count*over” 但这两种方法都会影响性能。 我想知道,是否有其他更快的方法来做到这一点。如果您需要更多信息,请告诉我。 谢谢。最快的方法是使用stopkey选择前两行,如果有多行,则丢弃结果(客户端或通过将其包装到另一个select中) 差不多 SELECT * from (

我正在执行一个SQL查询,它扫描两个具有数百万行的表。 我试图实现的是,只有当结果集只包含一行时,select查询才应该返回结果。 我知道这两种方法:

1使用分组依据,然后使用“计数*”

2使用内部查询,进一步使用“count*over”

但这两种方法都会影响性能。 我想知道,是否有其他更快的方法来做到这一点。如果您需要更多信息,请告诉我。
谢谢。

最快的方法是使用stopkey选择前两行,如果有多行,则丢弃结果(客户端或通过将其包装到另一个select中)

差不多

SELECT * from (
   SELECT * from 
     THE_MASSIVE_QUERY_WITH_ALL_SORTING_REMOVED_BECAUSE_YOU_DONT_NEED_IT
) WHERE rownum < 3

通过这种方式,您可以告诉Oracle在找到第二行时停止。无需确定实际计数,这可能需要花费大量时间。

对于纯SQL方式,可以这样做

select * 
  from (select c.*, count(*) over() cnt 
          from (select * from table where x = 'a' etc) c 
         where rownum <= 2) 
 where cnt = 1;

当然,如果您的查询具有order by,它将不得不扫描结果集。如果是这种情况,正确的索引+也许第一行提示将有所帮助。

我假设您只需要SQL,而不是PL/SQL作为select into from。。将满足此条件,因为2+行=太多行异常。如果您的查询具有order by,请将其删除。由于您只需要一行或不需要任何内容,因此不需要对任何内容进行排序。Dazzal,您的查询完成了以下操作:但我想等待更多答案,以便选择最佳答案。但是是的,你的解决方案真的很好!