1. 程式人生 > >oracle中關於count(1)、count(*)、count(rowid)、count(某個欄位)使用上的區別和效能問題

oracle中關於count(1)、count(*)、count(rowid)、count(某個欄位)使用上的區別和效能問題

轉自https://blog.csdn.net/fly_zxy/article/details/52796319count()是oracle中的聚合函式,用於統計結果集的行數。count(1)、count(*)、count(rowid)這三種使用方式的統計的行數量都會包括null行。count(某個欄位)這種方式統計的行數不會包括欄位值為null的值。下面舉例說明。有如下表:drop table testzxy; create table testzxy( name varchar2(100), age number , id number primary key not null ); insert into testzxy values('A',null,1); insert into testzxy values('B',20,2); select * from testzxy;查詢結果:NAMEAGEID20查詢結果:select count(*) from testzxy; select count(rowid) from testzxy; select count(1) from testzxy; 以上三條SQL返回的行數量都是2.select count(age) from testzxy; SQL返回的行數是1。因為有一行的age欄位值是null。這個我在網上查詢了一些資料,有兩種說法。第一種:表有主鍵列,count(1)的效率會稍微高於count(*),count(主鍵列)效率會高於count(1)。表沒有主鍵列,count(1)效率會高於count(*)。第二種:這四種count的方式,在有主鍵的情況下效率是一樣的,因為四種方式都會走主鍵索引,在沒有主鍵的情況也是一樣的,因為都會全表掃描。為了驗證這兩種說法,我們來坐一個測試。有表testzxy01,表中的資料行數是 833661。沒有主鍵的情況下我們看執行計劃的耗時,如圖:有主鍵的情況下,我們來看一下執行計劃的耗時,如圖:結果顯而易見沒有主鍵的情況下四種count()方式耗時都是2394,走的都是全表掃描。有主鍵的情況下四種count()方式耗時都是1806,走的是主鍵,也就是唯一索引。由此可見第二種說法是正確的。備註:在表有主鍵的情況下,count(欄位),這個欄位是不是主鍵欄位都會走主鍵索引的,這是oracle的優化選擇。