【问题标题】:Oracle select: Fastest way to get total number of rowsOracle select:获取总行数的最快方法
【发布时间】:2012-11-17 10:03:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我假设您只需要 SQL,而不是 PL/SQL(如 select into from..)将满足此要求,因为 2+ rows = TOO_MANY_ROWS 异常。

标签: performance oracle select count resultset


【解决方案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,无论如何它都必须扫描结果集(如果是这样的话,正确的索引 + 也许第一行提示会有所帮助。)

【讨论】:

  • 如果您的查询有 order by,请将其删除。由于您只想要一行(或什么都不想要),因此无需对任何内容进行排序。
  • Dazzal,您的查询可以解决问题 :) 但我想等待更多答案以选择最佳答案。但是,是的,您的解决方案非常好!
【解决方案2】:

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

类似

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多