2011-08-19 7 views
12

Eventuali duplicati:
Count(*) vs Count(1)SQL Best Practice: count (1) o il conteggio (*)

Ricordo anecdotally stato detto:

mai usare count (*) quando il conteggio (1) farà

Recentemente ho passato questo consiglio a un altro sviluppatore, e sono stato sfidato a dimostrare che questo era vero. La mia argomentazione era quella che mi è stata raccontata insieme a quando mi è stato dato il consiglio: che il database avrebbe restituito solo la prima colonna, che sarebbe stata quindi conteggiata. Il controargomento era che il database non valutava nulla tra parentesi.

Da alcuni test (non scientifici) su tavolini, sembra non esserci alcuna differenza. Al momento non ho accesso a tabelle di grandi dimensioni su cui sperimentare.

Mi è stato dato questo consiglio mentre stavo usando Sybase e le tabelle avevano centinaia di milioni di righe. Ora sto lavorando con Oracle e molti meno dati.

Quindi credo che, in sintesi, le mie due domande sono:

  1. che è più veloce, count (1) o count (*)?
  2. Questo varrebbe in diversi fornitori di database?
+1

1. SQL ANSI definisce 'COUNT (*)' deve essere ottimizzato 2. Questo vale per la maggior parte degli RDBMS. Qualsiasi altra cosa si applica solo alle versioni precedenti * dove indicato * altrimenti supponiamo che COUNT (*) sia ottimizzato. – gbn

risposta

13

Secondo un'altra domanda simile (Count(*) vs Count(1)), sono la stessa cosa.

In Oracle, in base a Ask Tom, il conteggio (*) è il modo corretto per contare il numero di righe perché l'ottimizzatore modifica il conteggio (1) per il conteggio (*). count (1) significa in realtà contare le righe con valori non nulli (tutti non sono nulli, quindi l'ottimizzatore lo cambierà automaticamente).

+0

+1 per aggiungere il collegamento Oracle – gbn

-3
  1. count (1)
  2. No, in generale questo avrà sempre un po 'meglio le prestazioni.

Avrebbe effetto solo se upscaled a una quantità drastica ma è una buona pratica.

+3

no e no. Miti. -1. Oltre a essere un duplicato, si ha questo su [DBA.SE] (http://dba.stackexchange.com/questions/2511/what-is-the-difference-tra i-seleziona-e-seleziona -non-null-col/2512 # 2512) – gbn

+1

Non penso sia corretto rendere la dichiarazione generale che conta (1) avrà sempre prestazioni leggermente migliori. – hatchet

+2

Hai qualche documentazione a sostegno di questa violazione della saggezza convenzionale? – dkretz

4

Nella lettura di libri specifici su TSQL e Microsoft SQL Server, ho letto che usare * è migliore perché consente all'ottimizzatore di decidere cosa è meglio fare. Cercherò di trovare i nomi dei libri specifici e pubblicarli qui.

+0

Questo si applicava anche all'utilizzo di "esiste (seleziona * da ...)" rispetto a "esiste (seleziona campo da ...)" –

+0

"conteggio (*)" è un linguaggio abbastanza comune che qualsiasi ottimizzatore dovrebbe tenerne conto, non solo SQL Server. Vorrei avere prove a sostegno di ciò. –

+0

@Mark Ransom: nello standard ANSI http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512 2512 – gbn

3

Questo è uno schema di query di base e il significato è identico. Ho letto più di una volta che l'ottimizzatore li tratta in modo identico - non riesco a trovare un riferimento specifico in questo momento ma lo metto nella categoria di "conoscenza istituzionale".

(avrebbe dovuto cercato prima ... http: //stackoverflow.com/questions/1221559/count-vs-count1)

1

Per quanto ne per mezzo di conteggio () dovrebbe essere più veloce, perché quando che la funzione è chiamata il motore conta solo gli indici. Da un altro punto di vista probabilmente entrambi contano () e count (1) in codice binario sembrano molto simili, quindi non ci dovrebbero essere differenze.

2

Posso solo parlare con SQL Server, ma test su una tabella da 5 GB, record da 11 mm: il numero di letture e il piano di esecuzione erano identici.

Direi che non c'è differenza.