为什么选择1比选择计数(*)更快?

10 database oracle performance rdbms

在Oracle中,当查询行存在时,为什么Select 1快于Select count(*)?

Mar*_*rtW 15

最好还是使用RDBMS支持的EXISTS或等效的EXISTS,因为这会在找到匹配后立即停止处理行.

  • +1我们应该只使用COUNT()我们需要知道所涉及的实际记录数. (5认同)

Jus*_*ave 14

由于Oracle不支持PL/SQL中的IF EXISTS,CodeByMidnight建议使用EXISTS通常会使用类似的东西来完成

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 
Run Code Online (Sandbox Code Playgroud)

Oracle知道它可以在找到一行后立即停止处理WHERE EXISTS子句,因此它不必计算符合条件的大量行.当然,如果要检查是否存在具有特定键的行,而不是检查涉及未编制索引的列的条件或检查可能导致返回大量行的条件,则这不是一个问题.

(注意:我希望我可以将其作为对CodeByMidnight帖子的评论发布,但评论不能包含格式化代码).

更新:鉴于原始海报在评论中做出的澄清,简短而明确的答案是a SELECT 1或者SELECT COUNT(1)不比a快SELECT COUNT(*).与您正在查看的编码指南相反,COUNT(*)是计算所有行的首选方法.有一个古老的神话,一个COUNT(1)更快.至少在过去十年中发布的任何Oracle版本中都不是这样,并且它不太可能是真的.然而,这是一种广泛持有的信念.今天,代码执行COUNT(1)而不是COUNT(*)通常使我怀疑作者倾向于相信各种Oracle神话,这就是我建议使用的原因COUNT(*).