Sono d'accordo con Jack. Conteggio (*) è un modo rapido per ottenere un conteggio delle righe, tuttavia, potrebbe essere necessario eseguire una scansione dell'indice cluster. Per i piccoli set di dati, questo non è un problema.
D'altra parte, è possibile utilizzare le viste del catalogo di sistema. Tuttavia, questi vengono aggiornati per qualche thread in background. Per set di dati da più terabyte, una ricerca nel catalogo potrebbe essere più veloce.
A seconda degli eventi di sistema, il conteggio può essere o meno accurato.
http://sqlblog.com/blogs/kalen_delaney/archive/2009/12/07/how-many-rows.aspx
tutto dipende da quanto accurato è necessario essere. Se si tratta di dati del libro mastro, allora molto accurato. Se si tratta di dati previsionali, potrebbe essere meno preciso.
Suggerisco di utilizzare RCSI invece del valore predefinito READ COMMITTED per ottenere un conteggio del tempo migliore. Si sta utilizzando la sintassi SELECT COUNT (*) FROM [TABLE].
http://www.sqlpass.org/summit/2013/Sessions/SessionDetails.aspx?sid=4730
Randy Cavaliere ha avuto una grande presentazione in questo ultimo anno.
Puoi anche guardare la mia presentazione di isolamento che ha codice che dimostra che READ COMMITTED può essere inaccurato.
http://craftydba.com/?page_id=880
elencate di seguito sono tre soluzioni.
Buona fortuna
J
-- 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 di analisi e tempo di compilazione: CPU time = 0 ms, tempo trascorso = 0 ms.
(1 riga (e) interessata) Tabella "Indirizzo". Conteggio scan 1, letture logiche 36, letture fisiche 1, letture read-ahead 34, letture logiche lob 0, letture fisiche lob 0, letture lob read-ahead 0.
Tempi di esecuzione server SQL: CPU time = 15 ms , tempo trascorso = 26 ms.
*/
-- 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 di analisi e compilare il tempo: il tempo CPU = 15 ms, tempo trascorso = 132 ms.
(1 riga (e) interessata) Tabella 'sysidxstats'.Conteggio scansioni 1, letture logiche 2, letture fisiche 2, letture read-ahead 0, letture logiche lob 0, lob letture fisiche 0, letture read-ahead lob 0. Tabella 'sysschobjs'. Conteggio scansioni 1, letture logiche 6, letture letture fisiche 0, letture fisiche lob 0, letture lob leggere 0 lettura
Tempi di esecuzione SQL Server: tempo CPU = 0 ms , tempo trascorso = 36 ms.
*/
-- Look at sys.partitions
SELECT max(rows) as 'Rows' FROM sys.partitions
WHERE object_id = object_id('Person.Address');
/*
SQL Server di analisi e compilare il tempo: il tempo CPU = 16 ms, tempo trascorso = 104 ms.
(1 riga (e) interessata) Tabella 'Worktable'. Conteggio scansioni 0, letture logiche 0, letture fisiche 0, letture read-ahead 0, letture logiche lob 0, lob letture fisiche 0, letture read-ahead lob 0. Tabella 'sysidxstats'. Conteggio scansioni 1, letture logiche 10, letture fisiche 2, letture read-ahead 0, letture logiche lob 0, lob letture fisiche 0, letture read-ahead lob 0. Tabella 'sysschobjs'. Conteggio scansioni 0, letture logiche 4, letture fisiche 2, letture read-ahead 0, letture logiche lob 0, letture lob fisiche 0, letture read-ahead lob 0. Tabella 'sysrowsets'. Intestazione 1, logico legge 6, letture fisiche 1, read-ahead legge 24, lob letture logiche 0, lob letture fisiche 0, pallonetto read-ahead legge 0.
esecuzione SQL Server Volte: CPU time = 0 ms , tempo trascorso = 34 ms.
*/
perché non utilizzare creare un array di risultati e usare 'count()' per calcolare righe restituite. Solo un pensiero. –