天天看點

oracle count(*)與count(列)的困擾

      從我做開發dba開始,count(*)和count(列)誰快就一直的困擾着我,通過這次學習,我總算是明白了。下面我把我的實驗過程寫出來。實驗環境: oracle11gR2,  實驗資料:自備 

      第一種情況:沒有索引的情況下 運作count(*)和count(列)

oracle count(*)與count(列)的困擾
oracle count(*)與count(列)的困擾

      可以看到cost是一樣的。 現在執行計劃都是 全表掃表的。速度看起來是一樣的。

  第二種情況:建立一個索引試試

  create index idx_object_id on t(object_id);

oracle count(*)與count(列)的困擾
oracle count(*)與count(列)的困擾

   結論:在有索引的情況下 OUNT(列)比COUNT(*)要。這個時候索引字段是包括null的,

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

  第三步:限制count字段not null

    alter table T modify object_id  not  null;

oracle count(*)與count(列)的困擾
oracle count(*)與count(列)的困擾

     看來count(列)和count(*)其實一樣快,如果索引列是非空的,count(*)可用到索引,此時一樣快!真相真是如此 嗎?不是的,其實兩者根本沒有可比性,性能比較首先要考慮寫法等價,這兩個語句根本就不等價!!!   

      通過上面的實驗,我以後不會吧count(*)和count(列)比較快慢了。

   最後補充下count(*)包括Null值,count(列)不包括Null.