我正在执行一个SQL查询,它扫描几百万行的表。 我试图实现的是我的select查询只有在结果集只包含一行时才返回结果。 我知道这两个方法:
1)使用group by然后'having count(*)'
2)使用内部查询,进一步使用'count(*)over'
但这两种方法都会妨碍表现。 我想知道,如果还有其他更快的方法来做到这一点。如果您需要更多信息,请与我们联系。 感谢。
答案 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停止。无需确定实际数量(这可能需要很长时间)。