Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

4 modi per contare le righe nella tabella di SQL Server con pro e contro

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:

  1. Usa la funzione COUNT().
  2. Combinazione di viste del catalogo di SQL Server.
  3. Utilizzo di sp_spaceused procedura memorizzata.
  4. 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:

  1. sys.tables – popola l'elenco delle tabelle.
  2. sys.indexes – popola l'elenco degli indici della tabella.
  3. 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:

  1. Nome – il nome della tabella
  2. Righe – il Conteggio delle righe in una tabella.
  3. Prenotato – lo spazio totale riservato per un tavolo.
  4. Dati – lo spazio totale utilizzato dal tavolo.
  5. Dimensione_indice – lo spazio totale utilizzato dall'indice.
  6. 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:

  1. Utilizzo della funzione COUNT.
  2. Combinazione di diverse viste del catalogo.
  3. Utilizzo di sp_spaceused procedura memorizzata.
  4. 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.