Eu me lembro que (no Oracle) há uma diferença entre expressar select count(*) from any_table
e select count(any_non_null_column) from any_table
.
Quais são as diferenças entre essas duas instruções, se houver?
Isso significa COUNT(any_non_null_column)
que dará o mesmo que é COUNT(*)
claro, porque não há valores NULL para causar diferenças.
Geralmente, COUNT(*)
deve ser melhor porque qualquer índice pode ser usado porque COUNT(column_or_expression)
pode não ser indexado ou SARGable
No ANSI-92 (procure por " Scalar expressions 125
")
Caso:
a) Se COUNT (*) for especificado, o resultado será a cardinalidade de T.
b) Caso contrário, seja TX a tabela de coluna única resultante da aplicação da <expressão de valor> a cada linha de T e da eliminação de valores nulos. Se um ou mais valores nulos forem eliminados, uma condição de conclusão será gerada: aviso - valor nulo eliminado na função definida.
As mesmas regras se aplicam ao SQL Server e Sybase também pelo menos
Nota: COUNT (1) é igual a COUNT (*) porque 1 é uma expressão não anulável.
count(*)
for usada.COUNT(*)
,COUNT(<constant>)
eCOUNT(<column name>)
e que todos os três poderiam ser prefixados comALL
ouDISTINCT
(falta paraALL
se omitido). Eu só estou querendo saber qual expressão pode ser usada onde você diz_or_expression
?COUNT(1)
como um exemplo inútil, é o mesmo queCOUNT(*)
.COUNT(CASE WHEN a>b THEN 1 END)
como um exemplo que conta linhas onde a> b.Em qualquer versão recente (ou seja, 8.x + ) do Oracle, eles fazem a mesma coisa . Em outras palavras, a única diferença é semântica:
é facilmente legível e óbvio o que você está tentando fazer, e
é mais difícil de ler porque
any_non_null_column
realmente é aplicado comonot null
Em resumo, use
count(*)
fonte
Em uma versão recente, de fato, não há diferença entre count (*) e count ( qualquer coluna que não seja nula ), com ênfase em não nulo :-) Incidentalmente, abordamos esse tópico com uma postagem de blog: É melhor contar do que contar (*)?
fonte
No livro Guia do exame de certificação DBA Oracle8i Professional Professional (ISBN 0072130601) , a página 78 diz que COUNT (1) realmente é executado mais rapidamente que COUNT (*) porque certos mecanismos são chamados para verificar o dicionário de dados para a nulidade de todas as colunas (ou pelo menos a primeira coluna com não anulabilidade) ao usar COUNT (*) . COUNT (1) ignora esses mecanismos.
Fraudes do MySQL para 'SELECT COUNT (1) em tblname;' nas tabelas MyISAM lendo o cabeçalho da tabela para a contagem de tabelas. O InnoDB conta sempre.
Para testar se COUNT (1) será executado mais rapidamente que COUNT (*) de maneira independente do banco de dados, basta executar o seguinte e avaliar o tempo de execução:
Isso faz com que a função COUNT opere no mesmo campo de atuação, independentemente do mecanismo de armazenamento ou RDBMS.
fonte