澳门新葡萄京官网注册select count()和select count(1)的区别和执行方式讲解

Count(*) 统计所有记录的行数,即使某一记录的所有字段为NULL也要记入统计。

我们在统计记录数时,常常推荐Count(*)而不推荐Count(字段名)(当然有特殊需要除外),这是因为Count(*)效率要高于Count(字段名),数据量越大表现越明显。

在SQL
Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。

Count(字段) 统计所有记录中这一字段值不为NULL的行数。

tbl表中:A是普通字段不可为NULL,B为普通字段可为NULL,id为主键,并在id上建聚集索引。
SET STATISTICS IO ON
select count(A) from tbl
select count(B) from tbl
select count(*) from tbl

往常我经常会看到一些所谓的优化建议不使用Count(*
)而是使用Count,从而可以提升性能,给出的理由是Count(
*)会带来全表扫描。而实际上如何写Count并没有区别。

Count(DISTINCT 字段)
统计所有记录中这一字段值不重复的行数,NULL算作一条。

F5执行,得到如下结果:

Count(1)和Count(*)实际上的意思是,评估Count中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL。

====================

DECLARE @xx INTSET @xx=NULLSELECT COUNT(@xx) FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]

(所影响的行数为 1 行)

代码清单1.Count中指定NULL,由于所有行都为NULL,则结果全不计数,显而易见,结果为0

表 ‘tbl’。扫描计数 1,逻辑读 244 次,物理读 0 次,预读 0 次。

因此当你指定Count(*)
或者Count或者无论Count(‘anything’)时结果都会一样,因为这些值都不为NULL,如下图所示

(所影响的行数为 1 行)

只要在Count中指定非NULL表达式,结果没有任何区别

警告: 聚合或其它 SET 操作消除了空值。
    表 ‘tbl’。扫描计数 1,逻辑读 2076 次,物理读 0 次,预读 0 次。

只看结果的话,Select Count(*)Select Count(1)
两着返回结果是一样的。

(所影响的行数为 1 行)

假如表沒有主键(Primary key),
那么count(1)比count(*)快,如果有主键的話,那主键作为count的条件时候count(主键)最快。

表 ‘tbl’。扫描计数 1,逻辑读 244 次,物理读 0 次,预读 0 次。

可以看到在统计字段B时,逻辑读达2076次,而另外两次均只有244次。这是由于使用Count(字段),而此字段又可为NULL,所以在统计时要将NULL忽略,这就使得要对每一条记录进行确定,所以很耗IO,假如没有合适的索引,更会引起全表扫描,要知道在记录非常多时全表扫描是致使的错误。而字段A由于不可为NULL,优化程序会优化它,所以它的IO也非常小。注意Count(*)中即使有两条记录字段全为NULL,也要算作两条记录。

相关阅读

  • select * 与 select fld1, fld2
    性能上有区别吗?

如果你的表只有一个字段的话那count(*)就是最快的。

count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column)
是不包括NULL的统计。

1、select 1 与 select *的区别

selelct 常量 from …
对应所有行,返回的永远只有一个值,即常量。所以正常只会用来判断是否有还是没有。而select
* from … 是返回所有行的所有列。

性能上的差异,关键看你的from和where子句。比如说如果你的where条件中可以通过索引,那显然
select 1 from … 的性能比 select * from … 好。

2、select sum(1)的使用

select count(*)返回所有满足条件的记录数,此时同select sum(1) 。

但是sum()可以传任意数字,负数、浮点数都可以,返回的值是传入值n*满足条件记录数m。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注