2013-08-13 12 views
12

Voglio sapere solo per curiosità che, Select Count(*) from SomeTableName attraversa anche tutte le righe del database come quella di Select * from SomeTableName?Is COUNT (*) indicizzato?

Oppure esiste un altro campo di conteggio disponibile nei metadati del database che si aggiorna automaticamente ogni volta che una riga viene aggiunta o eliminata? E a quel campo si accede dalla precedente query.

Inoltre, desidero sapere quale delle due query è più veloce e quanto?

+0

come può db tenere traccia del conteggio? cosa succede se chiedi di contare con filtro dove? –

+2

'count (*)' sta bene, 'select *' non è –

+0

@ArsenMkrt quindi conterrà solo i dati che soddisfano la condizione – zxc

risposta

17
SELECT Count(*) 
FROM SomeTableName 

conteggia tutte le righe. Sebbene (a differenza di SELECT *) non debba leggere tutte le colonne e può utilizzare l'indice più stretto (non filtrato) disponibile per farlo.

A differenza di MySQL (motore MyISAM) non recupera il valore dai metadati.

Un valore di conteggio delle righe è disponibile nei metadati e può essere recuperato da sys.partitions ma non viene mai utilizzato per le query COUNT e non è sempre accurato.

+0

grazie per questa spiegazione breve e semplice. :) –