2010-07-01 18 views
5

Eventuali duplicati:
Performance of COUNT SQL functionè il conteggio (colonna indicizzata) più veloce del conteggio (*)?

Ciao a tutti, ho molto grandi tavoli e ho bisogno di conoscere il numero di record in ciascuna, La mia domanda è la riduce il tempo di esecuzione se corro:

select count(indexed column like my PK) from tbTest 

invece di

select count(*) from tbTest 
+0

a dire il vero non ho trovato quella domanda ma penso che la mia domanda sia leggermente diversa perché riguarda la colonna indicizzata: D grazie – Asha

risposta

0

molto probabilmente, se la query esegue la scansione dell'indice anziché dell'intera tabella.

è una cosa facile da testare, diventare il proprio scienziato.

6

vedere Performance of COUNT SQL function

La cosa importante da notare è che non sono equivalenti

+0

Ho pensato che fosse stato chiesto prima.;) – NotMe

+0

Questa domanda nel collegamento fa riferimento a some_column_name ma questa domanda è per count (indexedcolumn) ... quindi sarà la stessa – Baaju

+1

@ Baaju, ci sono colonne indicizzate oltre al PK. –

-1

Entrambi sono identici. Se si guarda il piano di esecuzione della query per entrambi, entrambi eseguiranno una "scansione dell'indice"

+0

Sono identici solo se la colonna selezionata è il PK, poiché COUNT (*) utilizzerà l'indice PK. –

+0

Sì! La domanda si riferisce alla colonna Pk indicizzata! Quindi devono essere identici! :) – Baaju

1

Poiché la domanda è se esista o meno una differenza di prestazioni, dipenderebbe dall'indice. Quando fai COUNT (*), utilizzerà le colonne PK per determinare il numero di righe. Se non si hanno indici oltre a un indice cluster sulle colonne PK, eseguirà la scansione dei nodi foglia sull'indice cluster. Probabilmente sono un sacco di pagine. Se si dispone di un indice non cluster che è più magro rispetto all'indice cluster, lo sceglierà invece, risultando in una minore lettura.

Quindi, se la colonna selezionata è contenuta nel più piccolo indice non clusterizzato sulla tabella, SQL Query Optimizer sceglierà quello per entrambi i conteggi () (se si dispone di un ix clusterizzato che è il PK) e contare (indicizzato_colonna). Se scegli un conteggio (indexed_col) contenuto solo in un indice ampio, il conteggio () sarà più veloce se il tuo PK è un indice cluster. Il motivo per cui questo funziona è che esiste un puntatore all'indice cluster in tutti gli indici non in cluster e SQL Server può calcolare il numero di righe in base a tale indice non in cluster.

Quindi, come al solito in SQL Server, dipende. Fai uno showplan e confronta le query tra loro.

+1

In altre parole. Il meglio che fai è ottenere la stessa velocità con 'contare (colonna indicizzata non nullo) dalla scheda 'E forse peggio. (A meno che le statistiche non siano massacrante). Con count (*), Query Optimizer può cambiare il suo piano nel caso in cui vengano aggiunti nuovi indici migliori. –

0

SELECT COUNT(*)può essere più veloce. Questo perché l'utilizzo di * dà all'ottimizzatore la libertà di scegliere qualsiasi colonna su cui contare. Supponiamo che tu abbia una chiave primaria su una colonna INT e una chiave non cluster su una colonna bigint diversa. Ma la chiave primaria è probabilmente l'indice con cluster, e in quanto tale è in realtà significativamente più grande dell'indice di bigint non cluster (ha più pagine). Quindi, se l'ottimizzatore è libero di scegliere l'indice bigint non cluster, può restituire la risposta più velocemente. Possibile molto più veloce, a seconda del tavolo.

Quindi nel complesso è sempre meglio lasciare come COUNT(*) e lasciare scegliere l'ottimizzatore.

Problemi correlati