我正在执行一个SQL查询,它可以扫描包含数百万行的几个表。 我想实现的是我的选择查询应该只返回结果,如果结果集只包含一行。 我知道这两个approches做到这一点:通过Oracle select:获取总行数的最快方法
1)使用组,然后 '具有COUNT(*)' '上计数(*)'
2)使用内部查询,其进一步的用途
但这两种认可都会妨碍表现。 我想知道,如果有其他更快的方法来做到这一点。如果您需要更多信息,请告诉我。 谢谢。
我正在执行一个SQL查询,它可以扫描包含数百万行的几个表。 我想实现的是我的选择查询应该只返回结果,如果结果集只包含一行。 我知道这两个approches做到这一点:通过Oracle select:获取总行数的最快方法
1)使用组,然后 '具有COUNT(*)' '上计数(*)'
2)使用内部查询,其进一步的用途
但这两种认可都会妨碍表现。 我想知道,如果有其他更快的方法来做到这一点。如果您需要更多信息,请告诉我。 谢谢。
像这样纯粹的SQL方式。
select *
from (select c.*, count(*) over() cnt
from (select * from table where x = 'a' etc) c
where rownum <= 2)
where cnt = 1;
当然
,如果您的查询通过有秩序,就必须扫描结果集反正(正确索引+也许第一行暗示将帮助,如果是这样的话。)
如果您的查询已排序,请将其删除。既然你只需要一行(或者什么都不需要),就没有必要对任何东西进行排序。 – Thilo
Dazzal,你查询的技巧:)但我想等待更多的答案,以选择最佳答案。但是,您的解决方案非常好! – user613114
最快的方法是选择带有一个停止键的前两行(如果有多个行,客户端或通过将其包装到另一个SELECT中,则丢弃结果)。
喜欢的东西
SELECT * from (
SELECT * from
THE_MASSIVE_QUERY_WITH_ALL_SORTING_REMOVED_BECAUSE_YOU_DONT_NEED_IT
) WHERE rownum < 3
这样,你告诉Oracle停止一旦发现第二排。无需确定实际计数(可能需要很长时间)。
我假设你想只是SQL,而不是PL/SQL(如select into from)将满足这个2+行= TOO_MANY_ROWS异常。 – DazzaL