Oracle基礎之count(1)和count(*)的區別

來源:互聯網
上載者:User

標籤:null   作用   div   統計   ora   效率   一個   rom   意思   

  在資料庫中Count(*)或者Count(1)或者Count([列])或許是最常用的彙總函式。很多人其實對這三者之間是區分不清的。本文會闡述這三者的作用,關係以及背後的原理。

     我在網上看到一些所謂的最佳化說建議不使用Count(* )而是使用Count(1),從而可以提升效能,給出的理由是Count( *)會帶來全表掃描。而實際上如何寫Count並沒有區別。

      Count(1)和Count(*)實際上的意思是,評估Count(XXX)中的運算式XXX是否為NULL,如果為NULL則不計數,而非NULL則會計數。比如我們看代碼1所示,在Count中指定NULL(最佳化器不允許顯式指定NULL,因此需要賦值給變數才能指定)。

select count(null) from tableA t;

其中表tableA中不存在一整行的值都為空白的。所以結果全不計數為0。
select count(*) from tableA t;
select count(1) from tableA t;
不管Count(*) 或者Count(1)或者無論Count(XXX)時結果都會一樣,因為這些值都不為NULL。

因此,count(*)和count(1)最大的區別有:

1、count(*)會帶來全表掃描(效率低)

2、count(*)不會過濾掉一整行值為null的行
3、count(1)會過濾掉一整行為null的行

4、count(1)和count(主鍵) 這兩個只掃描主鍵Index就可以得到資料,或者說count(ROWID)這也是只掃描Index的(效率高),

這個問題就是問你什麼時候Oracle容易走表查詢,什麼時候Oracle容易走INDEX查詢。

實際應用中,你得看實際情況,沒準這個表沒有唯一鍵索引呢?在CBO(ORACLE提供的一種SQL最佳化器)的情況下,統計情報不準確呢?

 因此,如果某個表上Count(*)用的比較多時,考慮在一個最短的列建立一個單列索引,會極大的提升效能。

Oracle基礎之count(1)和count(*)的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.