oracle count(*)与count(列)的困扰

      从我做开发dba开始,count(*)count(列)谁快就一直的困扰着我,通过这次学习,我总算是明白了。下面我把我的实验过程写出来。实验环境: oracle11gR2,  实验数据:自备 

      第一种情况:没有索引的情况下 运行count(*)count()

      oracle count(*)与count(列)的困扰_第1张图片

      oracle count(*)与count(列)的困扰_第2张图片

      可以看到cost是一样的。 现在执行计划都是 全表扫表的。速度看起来是一样的。


  第二种情况:建立一个索引试试

  create index idx_object_id on t(object_id);

  oracle count(*)与count(列)的困扰_第3张图片

  oracle count(*)与count(列)的困扰_第4张图片

   结论:在有索引的情况下 OUNT(列)比COUNT(*)。这个时候索引字段是包括null的,

 如果我们限制下索引字段not Null

 

  第三步:限制count字段not null

    alter table T modify object_id  not  null;

   oracle count(*)与count(列)的困扰_第5张图片

   oracle count(*)与count(列)的困扰_第6张图片

   

     看来count()count(*)其实一样快,如果索引列是非空的,count(*)可用到索引,此时一样快!真相真是如此 吗?不是的,其实两者根本没有可比性,性能比较首先要考虑写法等价,这两个语句根本就不等价!!!   

      通过上面的实验,我以后不会吧count(*)count()比较快慢了。

   最后补充下count(*)包括Null值,count(列)不包括Null.

你可能感兴趣的:(oracle索引,oracle,sql,count)