提高MSSQL資料庫效能(1)對比count(*) 和 替代count(*)

iSQlServer發表於2010-03-31

文章準備的資料庫: Atricles 表   資料量60690000條資料

ArticleID 主鍵自增列+自動建立的聚集索引,ATitle nvarchar(100)  Acontent varchar(2000) CreateDate DateTime(8)  

首先要說的是:select count(*) from table,那麼count(*) 和 count(主鍵) count(文字列)效率比較:  這裡是測試主程式碼

         dbcc freeProcCache  --清空SqlCache

              SET STATISTICS io ON

        SET STATISTICS time ON

        go

        ----這裡是測試語句

        go

        SET STATISTICS profile OFF

        SET STATISTICS io OFF

        SET STATISTICS time OFF

那麼我們來看看:

SELECT COUNT(*) FROM ATRICLES                          CPU 時間 = 1125 毫秒,佔用時間 = 1140 毫秒。

SELECT COUNT(ATRICLEID) FROM ATRICLES           CPU 時間 = 1093 毫秒,佔用時間 = 1094 毫秒

SELECT COUNT(ATITLE) FROM ATRICLES                 CPU 時間 = 2266 毫秒,佔用時間 = 2267 毫秒

SELECT COUNT(ACONTENT) FROM ATRICLES           CPU 時間 = 2296 毫秒,佔用時間 = 2303 毫秒。

Count(*) 是在處了 count(主鍵) 之外速度最快的  為什麼最快其實我也不知道 - -! 猜想可能是SQL自動做了查詢優化

 

那麼我們是否一定得要 COUNT(*)呢 不是的 大家看這裡:

SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('ATRICLES') AND INDID = 1

那麼我們看看它和select count(主鍵)的比較吧:

首先是Count(主鍵)

表'ATRICLES'。掃描計數 1,邏輯讀取 120368 次,物理讀取 3 次,預讀 120364 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

 SQL Server 執行時間:  CPU 時間 = 2282 毫秒,佔用時間 = 21334 毫秒。

其次是 from SYSINDEXES

表 'SYSINDEXES'。掃描計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0次,lob 預讀 0 次。

 SQL Server 執行時間:   CPU 時間 = 0 毫秒,佔用時間 = 1 毫秒。

SYSINDEXES 系統表   所有的表 行集 索引資訊 存放在這個表中

ID =OBJECT_ID('ATRICLES') ID的意思是 索引所屬的表ID

INDID 表示在聚集索引上查詢 因為主鍵在建立的時候已經自動的建立了聚集索引

ROWS 基於 indid = 0 和 indid = 1 的資料級行計數,如果 indid >1,則該值包含重複的計數。

這篇文章想說的是: 在分頁情況下 可以考慮使用上面語句查詢資料行   AND  count(*) 並不是低效率的 感謝下面朋友指教

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-630936/,如需轉載,請註明出處,否則將追究法律責任。

相關文章