0

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

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

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

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

4

2 回答 2

1

像这样的纯 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,则无论如何它都必须扫描结果集(如果是这种情况,正确的索引 + 也许第一行提示会有所帮助。)

于 2012-11-29T10:52:44.550 回答
0

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

就像是

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

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

于 2012-11-29T10:49:53.060 回答