选择计数(*)和选择计数(any_non_null_column)有什么区别?


58

我似乎记得(在Oracle上)说select count(*) from any_table和之间有区别select count(any_non_null_column) from any_table

这两个语句之间有什么区别(如果有)?

Answers:


72
  • COUNT(*)将包含NULL
  • COUNT(column_or_expression)不会。

当然,这意味着COUNT(any_non_null_column)会给出相同的结果COUNT(*),因为没有NULL值会引起差异。

通常,COUNT(*)应该更好,因为可以使用任何索引,因为COUNT(column_or_expression)可能没有索引或SARGable

ANSI-92(查找“ Scalar expressions 125”)

案件:

a)如果指定了COUNT(*),则结果为T的基数。

b)否则,将TX设为单列表,这是对<T的每一行应用<value expression>并消除空值的结果。如果消除了一个或多个空值,则会引发完成条件:警告-设置函数中的空值已消除。

相同的规则至少也适用于SQL Server和Sybase

注意:COUNT(1)与COUNT(*)相同,因为1是不可为空的表达式。


4
仅出于完整性考虑:Oracle将在使用索引的非空列上使用索引扫描count(*)
a_horse_with_no_name 2012年

我以为三个可能的选项是COUNT(*)COUNT(<constant>)并且COUNT(<column name>)所有三个都可以加ALL或前缀DISTINCTALL如果省略则默认为)。我只是想知道您说的地方可以使用什么表达方式_or_expression
一天,2016年

2
@oneday COUNT(1)当无用的示例时,与相同COUNT(*)COUNT(CASE WHEN a>b THEN 1 END)例如,计算a> b的行。
ypercubeᵀᴹ

16

在任何最新的Oracle (即8.x +)版本中,它们都执行相同的操作。换句话说,唯一的区别是语义:

select count(*) from any_table

易于阅读,并且很明显您正在尝试做的事情,并且

select count(any_non_null_column) from any_table

很难阅读,因为

  1. 它更长
  2. 它很难识别
  3. 您必须考虑是否any_non_null_column真的被强制执行为not null

简而言之,使用count(*)



1

在《Oracle8i认证专家DBA认证考试指南》(ISBN 0072130601)一书中,第78页指出COUNT(1)实际上比COUNT(*)运行得更快,因为调用了某些机制来检查数据字典中每一列的可为空性(或使用COUNT(*)时,至少第一列具有不可空性。COUNT(1)绕过那些机制。

MySQL欺骗“ tblname上的SELECT COUNT(1);” 通过读取表头以获取表计数来访问MyISAM表。InnoDB每次都会计数。

要测试COUNT(1)是否以与数据库无关的方式比COUNT(*)运行更快,只需运行以下命令并自己判断运行时间:

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

这使得COUNT函数在相同级别的竞争环境中运行,而与存储引擎或RDBMS无关。


8
考试指南有误。在Oracle中,count(*)= count(1)(至少在版本7之后)。参见asktom.oracle.com/pls/asktom/…(已由@JackPDouglas引用)
Leigh Riffel

3
有趣。COUNT(*)完全不应该按照ANSI规范检查列。有人问SO为SQL Server前段时间太stackoverflow.com/questions/1221559/count-vs-count1/...
GBN

@ gbn,@ Leigh Riffel,@ bernd_k感谢您的参与,并提醒我阅读和学习更多,尤其是因为我已经有一段时间没有与Oracle合作了。
RolandoMySQLDBA 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.