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

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

#1 楼


COUNT(*)将包含NULLS
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 set函数中消除了空值。


同样的规则适用于SQL Server和Sybase至少也是如此。

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

评论


仅出于完整性考虑:如果使用count(*),Oracle将在索引的非空列上使用索引扫描。

– a_horse_with_no_name
2012年2月6日在8:26

我认为这三个可能的选项是COUNT(*),COUNT()和COUNT(),并且所有这三个选项都可以加上ALL或DISTINCT作为前缀(如果省略,则默认为ALL)。我只是想知道在说_or_expression的地方可以使用什么表达式?

–有一天
16年7月27日在10:26

@oneday当COUNT(1)作为无用的示例时,它与COUNT(*)相同。以COUNT(a> b THEN 1 END的情况为例)来计算a> b的行。

–超立方体ᵀᴹ
16-10-28在18:39

#2 楼

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

select count(*) from any_table


很容易阅读,并且很清楚您正在尝试做的事情,并且

select count(any_non_null_column) from any_table


较难阅读,因为


它较长
它不易识别
您必须考虑any_non_null_column是否真的作为not null强制执行


简而言之,请使用count(*)

#3 楼

在最新版本中,count(*)与count(任何非null列)之间确实没有区别,强调非null :-)
在博客文章中偶然涉及了该主题:is count(col )比count(*)好吗?

#4 楼

在《 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无关。

评论


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

–雷·里菲尔(Leigh Riffel)
2011年5月4日15:23

有趣。 COUNT(*)完全不应该按照ANSI规范检查列。不久前也有人问过SQL Server的SOstackoverflow.com/questions/1221559/count-vs-count1/…

– gbn
2011年5月4日15:25

@ gbn,@ Leigh Riffel,@ bernd_k感谢您的参与,并提醒我阅读和学习更多,尤其是因为我已经有一段时间没有与Oracle合作了。

– RolandoMySQLDBA
2011年5月4日17:40