1. 程式人生 > >提高MSSQL數據庫性能(1)對比count(*) 和 替代count(*)

提高MSSQL數據庫性能(1)對比count(*) 和 替代count(*)

profile 感謝 ccache blog 猜想 .html itl arc .cn

原文:提高MSSQL數據庫性能(1)對比count(*) 和 替代count(*)

文章準備的數據庫: 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(*) 並不是低效率的 感謝下面朋友指教

本文結束 晚安

技術分享圖片 技術分享圖片

提高MSSQL數據庫性能(1)對比count(*) 和 替代count(*)