我同意傑克。我數(*)是獲取行數的快捷方式,但是,您可能必須執行聚簇索引掃描。對於小數據集,這不是問題。
另一方面,您可以使用系統目錄視圖。但是,這些按照後臺線程更新。對於多TB數據集,目錄查找可能會更快。
根據系統事件,計數可能會或可能不準確。
http://sqlblog.com/blogs/kalen_delaney/archive/2009/12/07/how-many-rows.aspx
這一切都取決於你需要如何準確是。如果它是分類帳數據,那麼非常準確。如果是預測數據,可能不太準確。
我建議使用RCSI而不是默認的READ COMMITTED來獲得更好的時間點數。這是使用SELECT COUNT(*)FROM [TABLE]語法。
http://www.sqlpass.org/summit/2013/Sessions/SessionDetails.aspx?sid=4730
蘭迪騎士有這個去年一個偉大的演示。
您還可以看看我的隔離演示文稿,其中包含演示READ COMMITTED可能不準確的代碼。
http://craftydba.com/?page_id=880
下面列出了三種解決方案。
好運
Ĵ
-- Show time & i/o
SET STATISTICS TIME ON
SET STATISTICS IO ON
GO
-- Remove clean buffers & clear plan cache
CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
GO
-- test database
use adventureworks2012
go
-- traverse the table
select count(*) as 'rows' from person.address
go
/*
SQL Server分析和編譯時間:CPU 時間= 0毫秒,經過時間= 0毫秒。 (1行受影響) 表'地址'。掃描計數1,邏輯讀取36,物理讀取1,預讀讀取34,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0.
SQL Server執行時間: CPU時間= 15 ms ,經過時間= 26毫秒。
*/
-- Look at sysindexes
select o.name as 'Table', max(i.rows) 'Rows'
from sysobjects o join sysindexes i
on o.id = i.id
where
(i.indid = 1 or i.indid = 0) and
o.type = 'U' and
o.name = 'Address'
group by o.name
go
/*
SQL Server分析和編譯時間: CPU時間= 15毫秒,經過時間= 132毫秒。 (1行受影響) 表'sysidxstats'。掃描計數1,邏輯讀取2,物理讀取2,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0. 表'sysschobjs'。掃描計數1,邏輯讀取6,物理讀取3,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0.
SQL Server執行時間: CPU時間= 0 ms ,經過時間= 36毫秒。
*/
-- Look at sys.partitions
SELECT max(rows) as 'Rows' FROM sys.partitions
WHERE object_id = object_id('Person.Address');
/*
SQL Server分析和編譯時間: CPU時間= 16毫秒,經過時間= 104毫秒。 (1行受影響) 表'工作臺'。掃描計數0,邏輯讀取0,物理讀取0,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀取讀取0. 表'sysidxstats'。掃描計數1,邏輯讀取10,物理讀取2,預讀讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀讀取0. 表'sysschobjs'。掃描計數0,邏輯讀取4,物理讀取2,預讀取讀取0,lob邏輯讀取0,lob物理讀取0,lob預讀取讀取0. 表'sysrowsets'。掃描計數1,邏輯讀取6,物理讀取1,預讀讀取24,lob邏輯讀取0,lob物理讀取0,lob預讀取讀取0.
SQL Server執行時間: CPU時間= 0 ms ,經過時間= 34毫秒。
*/
爲什麼不使用創建結果的數組,並使用'計數()'來計算返回的行。只是一個想法。 –