count(*),count(1)和count(主鍵) 區別


看如下數據:

 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優化器)的情況下,統計情報不准確呢?

這種問題會出現好多版本的回答。測試環境不同結果也不一樣,你隨便鍵個表,看看它們的執行計划,就能看出他們的區別了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM