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

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

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

select count(null) from tableA t;

其中表tableA中不存在一整行的值都为空的。所以结果全不计数为0。
select count(*) from tableA t;
select count(1) from tableA t;
不管Count(*) 或者Count(1)或者无论Count(XXX)时结果都会一样,因为这些值都不为NULL。

因此,count(*)和count(1)最大的区别有:

1、count(*)会带来全表扫描(效率低)

2、count(*)与count(1)都包括null统计

3、count(column)不包括null统计
4、count(1)和count(主键) 这两个只扫描主键Index就可以得到数据,或者说count(ROWID)这也是只扫描Index的(效率高),

这个问题就是问你什么时候Oracle容易走表查询,什么时候Oracle容易走INDEX查询。

实际应用中,你得看实际情况,没准这个表没有唯一键索引呢?在CBO(ORACLE提供的一种SQL优化器)的情况下,统计情报不准确呢?

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

最新文章

  1. Hibernate连接mysql数据库的配置
  2. entity framework 删除数据库出现错误的解决方法--最土但是很有效的方法
  3. WINDOW的cmd的命令【转载】
  4. SQL Server获取下一个编码字符串的实现方案分割和进位
  5. iOS杂谈-我为什么不用Interface builder
  6. 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(二)
  7. 【转】仿百度输入框智能提示的js代码
  8. EffectiveJava笔记(第一部分)
  9. Jquery 使用小结
  10. C/C++走过的坑(基础问题篇)
  11. Qt MinGW 使用联合编译IncrediBuild
  12. Flexigrid的API
  13. MVC 5 on Windows Server 2008/IIS 7
  14. return机制
  15. Python库: PrettyTable 模块
  16. s3 api接口的调用
  17. PHP的curl查看header信息的功能(包括查看返回header和请求header)
  18. 安装Docker和配置加速器(二)
  19. iOS - 富文本直接设置文字的字体大小和颜色
  20. day_5.26python动态添加属性和方法

热门文章

  1. windbg调试驱动程序
  2. input 标签只能输入数字
  3. cordova 更改app的图标
  4. Nginx unknown directive ""
  5. Linux 开机、重启和用户登录注销、用户管理、用户组
  6. 07-oracle多表查询
  7. 我的Python升级打怪之路【三】:Python函数
  8. idea maven install 卡住,无报错排查。
  9. Android下so注入和hook
  10. LookupError: unknown encoding: cp65001的问题