[SQL SERVER]count function小提醒(下)

我只是很easy把系統全部count(column)替換成count(*),整體系統查詢效能提高20倍以上,效能調校就是這麼有趣。

由於count 算是一個昂貴操作,所以想知道資料表總筆數最快方法可參考[SQL SERVER][Memo]取得資料表筆數幾種方法一文,依目前版本來說,透過query metadata( sys.partitions) 絕對是最快的方法(但筆數可能不夠準確)。而我另外一篇文章[SQL Server]count function小提醒也介紹了count(*)和count(column)的主要差異,因日前協助處理某公司核心系統效能問題,發現不少人認為這兩種用法效能應該差異不大,這一篇我簡單解釋兩種用法效能差異。

 

判斷資料是否存在,請使用exists取代count(*)

declare @Rows bigint

set @Rows=(select count(*) from tbl5 where id>1234)

if @Rows>0

print 'Yes'

if exists (select 1 from tbl5 where id>1234)

print 'Yes'

因為exists並不會操作full scan,只要有任一符合條件資料立即返回true,所以整體上I/O較count(*)少很多。

 

Count(*)永遠比count(column)

select count(*) from tbl5 where id>1000

select count(c3) from tbl5 where id>1000

可以看到count(column)相當耗用I/O,這是因為count(column)需要額外檢查該欄位是否存在null,

這一操作不只要掃瞄整個資料表,最後還要進行彙總處理(排除NULL)才能返回結果集(把控制權交還給client)。