Oracle选择:获取总行数的最快方法

时间:2012-11-29 10:42:54

标签: performance oracle select count resultset

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

1)使用group by然后'having count(*)'

2)使用内部查询,进一步使用'count(*)over'

但这两种方法都会妨碍表现。 我想知道,如果还有其他更快的方法来做到这一点。如果您需要更多信息,请与我们联系。 感谢。

2 个答案:

答案 0 :(得分:1)

这样的纯SQL方式。

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

当然,如果你的查询有顺序,那么无论如何都必须扫描结果集(如果是这种情况,正确的索引+也许第一行提示会有所帮助。)

答案 1 :(得分:0)

最快的方法是使用stopkey选择前两行(如果有多行,无论是客户端还是将其包装到另一个SELECT中,则抛弃结果)。

这样的东西
SELECT * from (
   SELECT * from 
     THE_MASSIVE_QUERY_WITH_ALL_SORTING_REMOVED_BECAUSE_YOU_DONT_NEED_IT
) WHERE rownum < 3

这样,一旦找到第二行,就告诉Oracle停止。无需确定实际数量(这可能需要很长时间)。