Di recente, stavo lavorando a un progetto di miglioramento delle prestazioni del database. Una procedura memorizzata causava problemi. Nel suo codice, una query ha popolato il Conteggio delle righe e ha memorizzato il valore in una variabile locale. Quella query stava scansionando un grande tavolo. A causa di ciò, l'utilizzo delle risorse è diventato notevolmente più elevato. Per risolvere il problema, abbiamo rimosso il codice errato e utilizzato le viste del catalogo di SQL Server per generare il conteggio delle righe della tabella.
Esistono vari modi per contare il numero di righe in una tabella di SQL Server. Questo articolo li descriverà affinché tu possa scegliere sempre il modo giusto per farlo.
Possiamo ottenere il conteggio delle righe della tabella con uno dei seguenti metodi:
- Usa la funzione COUNT().
- Combinazione di viste del catalogo di SQL Server.
- Utilizzo di sp_spaceused procedura memorizzata.
- Utilizzo di SQL Server Management Studio.
Scaviamo più a fondo.
Ottieni il conteggio delle righe utilizzando COUNT(*) o Count(1)
Possiamo usare la funzione COUNT(*) o COUNT(1):i risultati generati da queste due funzioni sono identici.
Per ottenere il conteggio delle righe, eseguiamo prima la query utilizzando COUNT(*). A scopo dimostrativo, ho impostato il valore di STATISTICS IO su ON.
USE wideworldimporters
go
SELECT Count(*)
FROM tblcustomer
go
Risultato:

Statistiche IO:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Come puoi vedere, SQL Server deve eseguire 691 letture logiche per soddisfare il risultato.
Ora eseguiamo la query utilizzando COUNT(1):
USE wideworldimporters
go
SELECT Count(1)
FROM tblcustomer
go
Risultato:

Statistiche IO:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Anche in questo caso, SQL Server deve eseguire 691 letture logiche per soddisfare il risultato.
Dovremmo ricordare che c'è un'opinione secondo cui Count (1) è più veloce della funzione Count (*). Tuttavia, come puoi vedere negli esempi precedenti, i set di risultati e le statistiche IO sono gli stessi. Pertanto, puoi utilizzare qualsiasi metodo per generare il conteggio delle righe delle tabelle.
Pro:
La funzione COUNT popola un numero preciso di righe dalla tabella.
Contro:
Quando si esegue la funzione COUNT, viene posizionato un blocco sulla tabella. Altre query che accedono alla tabella devono attendere fino a quando non viene generato il risultato. Se stai lavorando su un sistema occupato con una tabella con milioni di righe, è meglio evitare di eseguire la funzione COUNT durante l'orario lavorativo, a meno che tu non debba compilare il conteggio esatto delle righe della tabella.
Combinazione di viste del catalogo di SQL Server
Possiamo utilizzare le viste del catalogo di SQL Server con le seguenti viste a gestione dinamica:
- sys.tables – popola l'elenco delle tabelle.
- sys.indexes – popola l'elenco degli indici della tabella.
- sys.partitions – popola le righe di ogni partizione.
Per ottenere il conteggio delle righe, esegui il seguente script:
SELECT a.NAME,
c.NAME,
Sum(b.rows)
FROM sys.tables a
INNER JOIN sys.partitions b
ON a.object_id = b.object_id
INNER JOIN sys.indexes c
ON b.index_id = c.index_id
AND b.object_id = c.object_id
WHERE a.object_id = Object_id('tblCustomer')
AND c.index_id < 2
Risultato:

La query popola il nome tabella , nome indice, e righe totali in tutte le partizioni.
Ora esaminiamo le statistiche IO:
Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Come puoi vedere, la query esegue solo 30 letture logiche.
Pro:
Questo approccio è più veloce della funzione COUNT. Non acquisisce un blocco sulla tabella utente, quindi puoi usarlo in un sistema occupato.
Contro:
Il metodo popola un conteggio approssimativo di righe. Nella documentazione Microsoft di sys.partitions, puoi vedere che le righe colonna riporta il numero approssimativo di righe per le partizioni.
Pertanto, se stai cercando una query che porti il risultato più velocemente della funzione COUNT, puoi utilizzare questa. Tuttavia, il risultato potrebbe essere impreciso.
Usa sp_spaceused
Il sp_spaceused la procedura insieme al conteggio delle righe fornisce i seguenti dettagli:
- Nome – il nome della tabella
- Righe – il Conteggio delle righe in una tabella.
- Prenotato – lo spazio totale riservato per un tavolo.
- Dati – lo spazio totale utilizzato dal tavolo.
- Dimensione_indice – lo spazio totale utilizzato dall'indice.
- Non utilizzato – lo spazio totale riservato per un tavolo non utilizzato.
La sintassi è:
EXEC Sp_spaceused 'database_name.schema_name.table_name'
La domanda:
EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer'
Risultato:

Utilizza SQL Server Management Studio
Per ottenere il conteggio delle righe della tabella, possiamo utilizzare SQL Server Management Studio.
Apri SQL Server Management Studio> Connetti all'istanza del database> Espandi Tabelle> Fai clic con il pulsante destro del mouse su tblCustomer> Proprietà

Nella Tabella Proprietà finestra, fare clic su Archiviazione . Vedrai il Conteggio righe valore a destra:

Un'altra opzione per ottenere il numero di righe in una tabella viene fornita con il componente aggiuntivo SQL Complete SSMS. Con questo miglioramento, puoi vedere il numero stimato di righe in un suggerimento quando passi il mouse sopra il nome di una tabella nella finestra Esplora oggetti. In questo modo, puoi ottenere i dati necessari in modalità visiva senza ulteriori sforzi.
Conclusione
Questo articolo ha spiegato diversi approcci per calcolare il numero totale di righe della tabella, in particolare:
- Utilizzo della funzione COUNT.
- Combinazione di diverse viste del catalogo.
- Utilizzo di sp_spaceused procedura memorizzata.
- Utilizzo di SQL Server Management Studio.
Non è necessario attenersi a un solo metodo. Ogni variante ha le sue specificità e puoi applicare quella più adatta alla tua situazione.