Trabalho na equipe do SQL Server e espero esclarecer alguns pontos deste segmento (eu não o havia visto anteriormente, então lamento que a equipe de engenharia não tenha feito isso anteriormente).
Em primeiro lugar, não há diferença entre semântica select count(1) from table
vs select count(*) from table
. Eles retornam os mesmos resultados em todos os casos (e é um erro, se não). Conforme observado nas outras respostas, select count(column) from table
é semanticamente diferente e nem sempre retorna os mesmos resultados que count(*)
.
Segundo, com relação ao desempenho, há dois aspectos que importariam no SQL Server (e no SQL Azure): trabalho em tempo de compilação e trabalho em tempo de execução. O trabalho de tempo de compilação é uma quantidade trivialmente pequena de trabalho extra na implementação atual. Há uma expansão do * para todas as colunas em alguns casos, seguida por uma redução de volta para 1 coluna, devido à forma como algumas das operações internas funcionam na ligação e otimização. Duvido que isso apareça em qualquer teste mensurável e provavelmente se perca no ruído de todas as outras coisas que acontecem sob as cobertas (como estatísticas automáticas, sessões xevent, sobrecarga do armazenamento de consultas, gatilhos etc.). São talvez alguns milhares de instruções extras sobre a CPU. Assim, count (1) trabalha um pouco menos durante a compilação (o que geralmente acontece uma vez e o plano é armazenado em cache em várias execuções subseqüentes). Para o tempo de execução, assumindo que os planos sejam os mesmos, não deve haver diferença mensurável. (Um dos exemplos anteriores mostra uma diferença - provavelmente é devido a outros fatores na máquina se o plano for o mesmo).
Sobre como o plano pode ser potencialmente diferente. É extremamente improvável que isso aconteça, mas é potencialmente possível na arquitetura do otimizador atual. O otimizador do SQL Server funciona como um programa de pesquisa (pense: programa de computador jogando xadrez pesquisando várias alternativas para diferentes partes da consulta e custando as alternativas para encontrar o plano mais barato em tempo razoável). Essa pesquisa possui alguns limites sobre como ela opera para manter a compilação de consultas concluída em tempo razoável. Para consultas além das mais triviais, há fases da pesquisa e elas lidam com trechos de consultas com base no quão caro o otimizador pensa que a consulta é potencialmente executada. Existem três fases principais de pesquisa e cada fase pode executar heurísticas mais agressivas (caras), tentando encontrar um plano mais barato do que qualquer solução anterior. Por fim, existe um processo de decisão no final de cada fase que tenta determinar se deve retornar o plano encontrado até agora ou se deve continuar pesquisando. Esse processo usa o tempo total gasto até agora em relação ao custo estimado do melhor plano encontrado até o momento. Portanto, em máquinas diferentes com velocidades diferentes de CPUs, é possível (embora raro) obter planos diferentes devido ao tempo limite excedido em uma fase anterior com um plano e continuar na próxima fase de pesquisa. Existem também alguns cenários semelhantes relacionados ao tempo limite da última fase e à falta de memória em consultas muito caras que consomem toda a memória da máquina (geralmente não é um problema em 64 bits, mas era uma preocupação maior). de volta em servidores de 32 bits). Por fim, se você obtiver um plano diferente, o desempenho no tempo de execução será diferente. Eu não'
Net-net: use o que você quiser, pois nada disso importa em nenhuma forma prática. (Existem fatores muito, muito maiores, que afetam o desempenho no SQL além deste tópico, honestamente).
Eu espero que isso ajude. Escrevi um capítulo de livro sobre como o otimizador funciona, mas não sei se é apropriado publicá-lo aqui (já que ainda recebo pequenos royalties dele). Então, em vez de postar, postarei um link em uma palestra que fiz no SQLBits no Reino Unido sobre como o otimizador funciona em um nível alto, para que você possa ver as diferentes fases principais da pesquisa com mais detalhes, se desejar para aprender sobre isso. Aqui está o link do vídeo: https://sqlbits.com/Sessions/Event6/inside_the_sql_server_query_optimizer