从我做开发dba开始,count(*)和count(列)谁快就一直的困扰着我,通过这次学习,我总算是明白了。下面我把我的实验过程写出来。实验环境: oracle11gR2, 实验数据:自备
第一种情况:没有索引的情况下 运行count(*)和count(列)
可以看到cost是一样的。 现在执行计划都是 全表扫表的。速度看起来是一样的。
第二种情况:建立一个索引试试
create index idx_object_id on t(object_id);
结论:在有索引的情况下 OUNT(列)比COUNT(*)要。这个时候索引字段是包括null的,
如果我们限制下索引字段not Null
第三步:限制count字段not null
alter table T modify object_id not null;
看来count(列)和count(*)其实一样快,如果索引列是非空的,count(*)可用到索引,此时一样快!真相真是如此 吗?不是的,其实两者根本没有可比性,性能比较首先要考虑写法等价,这两个语句根本就不等价!!!
通过上面的实验,我以后不会吧count(*)和count(列)比较快慢了。
最后补充下count(*)包括Null值,count(列)不包括Null.