Select Count(*)、Count(1)、Count(0)的区别和执行效率比较(纯总结)

纯总结,观后笔记一样的存在,若理解有误欢迎指正!

这是我围观的文章1
这是我围观的文章2
W3School对SQL count()的解释

首先,COUNT() 函数的定义:返回匹配指定条件的行数。
COUNT(*) 函数返回表中的记录数,包括 NULL 值和重复项。不能与 DISTINCT 一起使用。不需要 expression 参数,因为根据定义,该函数不使用有关任何特定列的信息。

也就是说count(*)只是返回表中行数,因此SQL Server在处理count(*)的时候只需要找到属于表的数据块块头,然后计算一下行数就行了,而不用去读取里面数据列的数据。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。
expression: 除 text、image 或 ntext 以外任何类型的表达式。不允许使用聚合函数和子查询。

  1. 在没有索引的情况下,count(*) 和count(1)的执行计划(或说执行效率)是一样的。不存在所谓的单列扫描和多列扫描的问题。
  2. count(*)和count(col)使用的目的是不一样的,在必须要使用count(col)的时候还是要用的,只是在统计表全部行数的时候count(*)就是最佳的选择了。
    count(col)就不一样了,为了去除col列中包含的NULL行,SQL Server必须读取该col的每一行的值,然后确认下是否为NULL,然后在进行计数。因此count(*)应该是比count(col)快的。
  3. count(col)能比count(distinct col)快很多。
  4. 如果你的数据表没有主键,那么count(1)比count(*)快 。
    如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快。
    如果你的表只有一个字段的话那count(*)就是最快的啦。
  5. count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。
    如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
    因为count(*)自动会优化指定到那一个字段。所以没必要去count(?),用count(*),sql会帮你完成优化的

猜你喜欢

转载自blog.csdn.net/qq_34702563/article/details/83507477
今日推荐