2012-11-29 27 views
0

我正在执行一个SQL查询,它可以扫描包含数百万行的几个表。 我想实现的是我的选择查询应该只返回结果,如果结果集只包含一行。 我知道这两个approches做到这一点:通过Oracle select:获取总行数的最快方法

1)使用组,然后 '具有COUNT(*)' '上计数(*)'

2)使用内部查询,其进一步的用途

但这两种认可都会妨碍表现。 我想知道,如果有其他更快的方法来做到这一点。如果您需要更多信息,请告诉我。 谢谢。

+0

我假设你想只是SQL,而不是PL/SQL(如select into from)将满足这个2+行= TOO_MANY_ROWS异常。 – DazzaL

回答

1

像这样纯粹的SQL方式。

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

,如果您的查询通过有秩序,就必须扫描结果集反正(正确索引+也许第一行暗示将帮助,如果是这样的话。)

+0

如果您的查询已排序,请将其删除。既然你只需要一行(或者什么都不需要),就没有必要对任何东西进行排序。 – Thilo

+0

Dazzal,你查询的技巧:)但我想等待更多的答案,以选择最佳答案。但是,您的解决方案非常好! – user613114

0

最快的方法是选择带有一个停止键的前两行(如果有多个行,客户端或通过将其包装到另一个SELECT中,则丢弃结果)。

喜欢的东西

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

这样,你告诉Oracle停止一旦发现第二排。无需确定实际计数(可能需要很长时间)。

相关问题