代码之家  ›  专栏  ›  技术社区  ›  user290

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

  •  12
  • user290  · 技术社区  · 16 年前

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

    8 回复  |  直到 16 年前
        1
  •  14
  •   Justin Cave    16 年前

    最好在RDBMS支持的地方使用EXISTS或等效工具,因为一旦找到匹配项,就会停止处理行。

        2
  •  15
  •   MartW    16 年前

    由于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 ); 
    

    Oracle知道,一旦找到一行,它就可以停止处理WHERE EXISTS子句,因此它不必计算大量符合条件的行。当然,如果你正在检查是否存在具有特定键的行,这比检查涉及未索引列的条件或检查可能导致返回大量行的条件更不重要。

    SELECT 1 SELECT COUNT(1) 不比a快 SELECT COUNT(*) 与您正在查看的任何编码指南相反, COUNT(*) 是计数所有行的首选方式。有一个古老的神话 COUNT(1) 更快。至少,在过去十年中发布的任何版本的Oracle中,这都不是真的,而且不太可能是真的。然而,这是一个被广泛接受的信念。今天,代码做了一个 计数(1) 而不是a 通常让我怀疑作者倾向于相信各种Oracle神话,这就是为什么我建议使用 .

        3
  •  2
  •   cjk    16 年前

    如果select count(*)没有得到适当的优化,我会感到惊讶,因为没有与列相关的处理,所以不需要在所有列中加载。

        5
  •  0
  •   Mario Mueller    16 年前

    重要的是指数。索引上的count()应该很快;)

        6
  •  0
  •   Evan Carroll    16 年前

    我认为这对Oracle来说不是真的。 http://justoracle.blogspot.com/2006/12/count-vs-count1.html

    但是,在某些数据库中,原因是“*”必须访问表元数据。这往往会增加不必要的开销。其中as 1只是字面意思。

        7
  •  0
  •   Jeffrey Kemp    16 年前

    在其他条件相同的情况下, "select 1 from my_table" 将返回 第一 "select count(*) from my_table" ,但如果从查询中检索所有结果 count(*)