select count(*) from any_table
和select 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设为单列表,这是将
set函数中消除了空值。
同样的规则适用于SQL Server和Sybase至少也是如此。
注意:COUNT(1)与COUNT(*)相同,因为1是一个不可为空的表达式。
#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
评论
仅出于完整性考虑:如果使用count(*),Oracle将在索引的非空列上使用索引扫描。
– a_horse_with_no_name
2012年2月6日在8:26
我认为这三个可能的选项是COUNT(*),COUNT(
–有一天
16年7月27日在10:26
@oneday当COUNT(1)作为无用的示例时,它与COUNT(*)相同。以COUNT(a> b THEN 1 END的情况为例)来计算a> b的行。
–超立方体ᵀᴹ
16-10-28在18:39