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

Prestazioni del conteggio SQL(*).

Mikael Eriksson ha una buona spiegazione qui sotto perché la prima query è veloce:

Il server SQL lo ottimizza in:if exists(select * from BookChapters) . Quindi cerca la presenza di una riga invece di contare tutte le righe nella tabella.

Per le altre due query, SQL Server utilizzerà la regola seguente. Per eseguire una query come SELECT COUNT(*) , SQL Server utilizzerà il più strettonon cluster index per contare le righe. Se la tabella non ha alcun indice non cluster, dovrà eseguire la scansione della tabella.

Inoltre, se il tuo tavolo ha un cluster index puoi ottenere il tuo conteggio ancora più velocemente usando la seguente query (preso in prestito da questo sito Ottieni il conteggio delle righe velocemente!)

--SQL Server 2005/2008
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc

--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc

Utilizza la tabella di sistema di sysindexes. Maggiori informazioni sono disponibili qui SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012

Ecco un altro collegamento Perché il mio SELECT COUNT(*) funziona così lentamente? con un'altra soluzione. Mostra la tecnica utilizzata da Microsoft per visualizzare rapidamente il numero di righe quando si fa clic con il pulsante destro del mouse sulla tabella e si selezionano le proprietà.

select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2

Dovresti scoprire che questo ritorna molto rapidamente, non importa quanti tavoli hai.

Se stai ancora usando SQL 2000 puoi usare la tabella sysindexes per ottenere il numero.

select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)

Questo numero potrebbe essere leggermente diverso a seconda della frequenza con cui SQL aggiorna la tabella sysindexes, ma di solito è corretto (o almeno abbastanza vicino).