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?
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?
Risposte:
Questo significa COUNT(any_non_null_column)
che fornirà lo stesso COUNT(*)
ovviamente perché non ci sono valori NULL per causare differenze.
In generale, COUNT(*)
dovrebbe essere migliore perché è possibile utilizzare qualsiasi indice perché COUNT(column_or_expression)
potrebbe non essere indicizzato o SARGable
Da ANSI-92 (cercare " 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 nulli. 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 almeno a SQL Server e Sybase
Nota: COUNT (1) è uguale a COUNT (*) perché 1 è un'espressione non annullabile.
COUNT(*)
, COUNT(<constant>)
e COUNT(<column name>)
che tutti e tre potessero essere preceduti da ( ALL
o in DISTINCT
difetto ALL
se omessi). Mi sto solo chiedendo quale espressione può essere usata dove dici _or_expression
?
COUNT(1)
come esempio inutile, è lo stesso di COUNT(*)
. COUNT(CASE WHEN a>b THEN 1 END)
come esempio che conta le righe in cui a> b.
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é
any_non_null_column
è davvero applicato comenot null
In breve, usacount(*)
In una versione recente non c'è davvero alcuna differenza tra count (*) e count ( nessuna colonna non nulla ), con l'accento su non null :-) Per inciso ho trattato quell'argomento con un post sul blog: Count (col) è meglio di count (*)?
Nel libro Oracle8i Certified Professional DBA Certification Guide Exam (ISBN 0072130601) , 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.
count(*)
viene utilizzato.