看如下數據:
1 SQL> select count(*) from ysgl_compile_reqsub; 2 3 COUNT(*) 4 ---------- 5 5288265 6 7 已用時間: 00: 00: 07.51 8 SQL> select count(1) from ysgl_compile_reqsub; 9 10 COUNT(1) 11 ---------- 12 5288265 13 14 已用時間: 00: 00: 00.68 15 SQL> select count(id) from ysgl_compile_reqsub; 16 17 COUNT(ID) 18 ---------- 19 5288265 20 21 已用時間: 00: 00: 00.68 22 SQL> select count(rowid) from ysgl_compile_reqsub; 23 24 COUNT(ROWID) 25 ------------ 26 5288265 27 28 已用時間: 00: 00: 01.01 29 SQL> select count(rowid) from ysgl_vdata_his; 30 31 COUNT(ROWID) 32 ------------ 33 5299458 34 35 已用時間: 00: 00: 09.98 36 SQL> select count(*) from ysgl_vdata_his; 37 38 COUNT(*) 39 ---------- 40 5299458 41 42 已用時間: 00: 00: 00.93 43 SQL> select count(1) from ysgl_vdata_his; 44 45 COUNT(1) 46 ---------- 47 5299458 48 49 已用時間: 00: 00: 00.71 50 SQL> select count(1) from ysgl_excelbasic; 51 52 COUNT(1) 53 ---------- 54 3755052 55 56 已用時間: 00: 00: 04.60 57 SQL> select count(*) from ysgl_excelbasic; 58 59 COUNT(*) 60 ---------- 61 3755052 62 63 已用時間: 00: 00: 00.50 64 SQL>
不考慮Null的情況:
count(1)和count(主鍵) 這兩個只掃描主鍵Index就可以得到數據,
count(*)是掃描表的。
所以count(1)和count(主鍵)這兩個效率高。
還有一種寫法是count(ROWID)這也是只掃描Index的,效率高。
這個問題就是問你什么時候Oracle容易走表查詢,什么時候Oracle容易走INDEX查詢。
實際應用中,你得看實際情況,沒准這個表沒有唯一鍵索引呢?在CBO(ORACLE提供的一種SQL優化器)的情況下,統計情報不准確呢?
這種問題會出現好多版本的回答。測試環境不同結果也不一樣,你隨便鍵個表,看看它們的執行計划,就能看出他們的區別了。