it-swarm.it

Qual è la differenza tra select count (*) e select count (any_non_null_column)?

Mi sembra di ricordare che (su Oracle) c'è una differenza tra pronunciare select count(*) from any_table e select count(any_non_null_column) from any_table.

Quali sono le differenze tra queste due affermazioni, se ce ne sono?

58
Martin
  • COUNT (*) includerà NULLS
  • COUNT (column_or_expression) no.

Questo significa che COUNT(any_non_null_column) fornirà lo stesso di COUNT(*) ovviamente perché non ci sono valori NULL per causare differenze.

In generale, COUNT(*) dovrebbe essere migliore perché qualsiasi indice può essere utilizzato perché COUNT(column_or_expression) potrebbe non essere indicizzato o SARGable

Da ANSI-92 (cerca "Scalar expressions 125 ")

Astuccio:

a) Se viene specificato COUNT (*), il risultato è la cardinalità di T.

b) Altrimenti, sia TX la tabella a colonna singola che è il risultato dell'applicazione di <espressione di valore> a ciascuna riga di T e dell'eliminazione di valori null. Se uno o più valori null vengono eliminati, viene sollevata una condizione di completamento: avviso - valore null eliminato nella funzione set.

Le stesse regole si applicano anche a SQL Server e Sybase almeno

Nota: COUNT (1) è uguale a COUNT (*) perché 1 è un'espressione non annullabile.

72
gbn

In qualsiasi versione recente (ovvero 8.x + ) di Oracle fanno la stessa cosa . In altre parole, l'unica differenza è semantica:

select count(*) from any_table

è facilmente leggibile ed evidente cosa stai cercando di fare, e

select count(any_non_null_column) from any_table

è più difficile da leggere perché

  1. è più lungo
  2. è meno riconoscibile
  3. devi pensare se any_non_null_column è davvero imposto come not null

In breve, usa count(*)

In una versione recente non esiste alcuna differenza tra count (*) e count ( any not null null), con l'accento su not null :-) Per inciso hai trattato quell'argomento con un post sul blog: Il conteggio (col) è migliore del conteggio (*)?

9
Uwe Hesse

Nel libro Guida all'esame per la certificazione DBA professionale Oracle8i certificata (ISBN 0072130601) , la pagina 78 dice che COUNT (1) verrà effettivamente eseguito più velocemente di COUNT (*) perché alcuni meccanismi vengono chiamati in gioco per controllare il dizionario dei dati per la nullità di ogni colonna (o almeno la prima colonna con non annullabilità) quando si utilizza COUNT (*) . COUNT (1) ignora questi meccanismi.

Trucchi MySQL per "SELECT COUNT (1) su tblname;" sulle tabelle MyISAM leggendo l'intestazione della tabella per il conteggio delle tabelle. InnoDB conta ogni volta.

Per verificare se COUNT (1) verrà eseguito più rapidamente di COUNT (*) in modo agnostico nel database, basta eseguire quanto segue e giudicare autonomamente il tempo di esecuzione:

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

Questo fa funzionare la funzione COUNT sullo stesso piano di gioco indipendentemente dal motore di archiviazione o dall'RDBMS.

1
RolandoMySQLDBA