我只是很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)。