【mysql】count(*),count(1)与count(column)区别_微辣米粉的博客-程序员秘密

技术标签: 【知识梳理】  

转自: https://www.cnblogs.com/CareySon/p/DifferenceBetweenCountStarAndCount1.html


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

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

    Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。

DECLARE @xx INT
SET @xx=NULL
 
SELECT COUNT(@xx) FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]

代码清单1.Count中指定NULL

 

     由于所有行都为NULL,则结果全不计数为0,结果如图1所示。

image

图1.显而易见,结果为0

 

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

image

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

 

 

那Count列呢?

    对于Count(列)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。

 

那Count(*)具体如何执行?

    前面提到Count( )有不为NULL的值时,在SQL Server中只需要找出具体表中不为NULL的行数即可,也就是所有行(如果一行值全为NULL则该行相当于不存在)。那么最简单的执行办法是找一列NOT NULL的列,如果该列有索引,则使用该索引,当然,为了性能,SQL Server会选择最窄的索引以减少IO。

    我们在Adventureworks2012示例数据库的[Person].[Address]表上删除所有的非聚集索引,在ModifyDate这个数据类型为DateTime的列上建立索引,我们看执行计划,如图3所示:

image

图3.使用了CreateDate的索引

 

    我们继续在StateProvinceID列上建立索引,该列为INT列,占4字节,相比之前8字节 DateTime类型的列更短,因此SQL Server选择了StateProvinceID索引。如图4所示。

image

图4.选择了更短的StateProvinceID索引

 

    因此,如果某个表上Count(*)用的比较多时,考虑在一个最短的列建立一个单列索引,会极大的提升性能。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tuntun1120/article/details/80707958

智能推荐

密码学系列 - 零知识证明(ZKP) - zkSNARKs_搬砖魁首的博客-程序员秘密

零知识证明 - ZKP算法属性可表示为: zk-SNARKs (简洁的非交互式零知识证明)Zero-KnowledgeSuccinctNon-interactiveARgument of Knowledge关键词见证人: 执行电路时产生的中间信号 - witness零知识证明证明您知道一组匹配所有约束的信号(见证),而不会泄露除公共输入和输出之外的任何信号。生成 provi...

python3读取多行数据合并_python3 数据规整化:清理、转换、合并、重塑(一)_weixin_39689687的博客-程序员秘密

一.合并数据集pandas对象中的数据可以通过一些内置的方式进行合并:1)pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的连接操作。2)pandas.concat可以沿着一条轴将多个对象堆叠到一起。3)实例方法combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象...

痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器_weixin_33754913的博客-程序员秘密

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是第一款Cortex-M微控制器。1.天生荣耀:ARM Cortex-M处理器由来  ARM公司自2004年推出ARMv7内核架构时,摒弃了以往"ARM+数字"这种处理器命名方法(ARM11之前的处理器统称经典处理器系列),重新启用Cortex来命名,并将Cortex系列细分为三大类:Cortex-A系列:面向性能密集型...

linux递归查询目录文件_如何在Linux上的目录中按修改时间对所有文件进行递归排序?..._cuma2369的博客-程序员秘密

linux递归查询目录文件How to sort all the files in a directory and subdirectories recursively by modification time on Linux? 如何在Linux上按修改时间对目录和子目录中的所有文件进行递归排序? You can make use of find (GNU find, or plus stat...

chrome连接已重置_Google推出适用于Chrome的软件删除和浏览器重置工具_cum88284的博客-程序员秘密

chrome连接已重置Google recently launched a new tool in the fight against crapware and spyware, and it’s an excellent start to helping clean up a computer that has been infected with nonsense like the Ask T...

VC++中LogFont设置字体 _lforientation_你来吻的博客-程序员秘密

LOGFONT是Windows内部字体的逻辑结构,主要用于设置字体格式,其定义如下:<br />typedef struct tagLOGFONTA<br />{<br />LONG lfHeight;<br />LONG lfWidth;<br />LONG lfEscapement;<br />LONG lfOrientation;<br />LONG lfWeight;<br />BYTE lfItalic;<br />BYTE lfUnderline;<br />BYTE lfStrikeOut;<

随便推点

java 内部错误2753_内部错误 2753.regutils.dll_Mather King的博客-程序员秘密

内部错误2753.regutils.dll(2013-01-02 14:17:38)标签:杂谈对于在java在安装过程中遇到的此类问题有个较好的解决方法。如果你用的是Windows操作系统,那么微软的清理工具软件(WindowsInstaller CleanupTool)是很有用的,我建议你首先使用该软件来清理一下你的机器。如果该软件不起作用,请遵照以下步骤,这样就可以安装一个全新版本的Java...

单调递增最长子序列 && 拦截导弹(nyoj 17 && nyoj 79)_汤匙的匙不是钥匙的匙的博客-程序员秘密

思路参考:点击打开链接单调递增最长子序列时间限制:3000 ms  |  内存限制:65535 KB难度:4描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4输入第一行一个整数0随后的n行,每行有一个字符串,该字符串的长度不会超过10000输出输出字符串的最长递增子序列的长度样例输入3aaaababcabk

Linux安装JDK-配置环境(详细图解)_陈永佳的博客-程序员秘密

Linux安装JDK-配置环境(详细图解)今天博主更新一篇关于Linux安装JDK-配置环境(详细图解)。不喜勿喷,欢迎关注,如有建议欢迎补充,讨论。1 系统任意位置,右键—在终端中打开1.1 su root(切换root账号,否则很多操作没有权限进行)1.2 java -version(查看系统自带openJDK版本)1.3 rpm -qa | grep java (查看相关ja...

四元数与欧拉角(RPY角)的相互转换_Jacky_546287052的博客-程序员秘密

https://www.cnblogs.com/21207-iHome/p/6894128.html比较经典,以便以后参考。

解决CentOS 7无法上网的问题_enp0s3:连接不上_toypipi的博客-程序员秘密

新安装好的CentOS 7无法上外网但是可以ping通同一网段的IP地址修改/etc/sysconfig/network-scripts/ifcfg-enp0s3文件,需要修改的内容如下蓝色所示vim /etc/sysconfig/network-scripts/ifcfg-enp0s3TYPE=Ethernet<font color=#87CEEB>BOOTPROTO=static</fon

Kerberos V5 Library Error Codes_credentials cache permissions incorrect while stor_zy531的博客-程序员秘密

http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-admin/Kerberos-V5-Library-Error-Codes.html#Kerberos-V5-Library-Error-CodesProtocol error codes are ERROR_TABLE_BASE_krb5 + the protocol e

推荐文章

热门文章

相关标签