Dada a sua especificação de que você está selecionando todas as colunas, há pouca diferença no momento . Perceba, no entanto, que os esquemas do banco de dados mudam. Se você usar, SELECT *
adicionará novas colunas à tabela, mesmo que com toda a probabilidade, seu código não esteja preparado para usar ou apresentar esses novos dados. Isso significa que você está expondo seu sistema a alterações inesperadas de desempenho e funcionalidade.
Você pode descartar isso como um custo menor, mas saiba que as colunas que você não precisa ainda devem ser:
- Ler do banco de dados
- Enviado pela rede
- Marshalled em seu processo
- (para tecnologias do tipo ADO) Salvas em uma memória de tabela de dados
- Ignorado e descartado / coletado de lixo
O item 1 tem muitos custos ocultos, incluindo a eliminação de algum índice de cobertura em potencial, causando carregamentos da página de dados (e debulha do cache do servidor), incorrendo em bloqueios de linha / página / tabela que, de outra forma, poderiam ser evitados.
Compare isso com a economia potencial de especificar as colunas e uma *
e a única economia potencial é:
- O programador não precisa revisitar o SQL para adicionar colunas
- O transporte de rede do SQL é menor / mais rápido
- Tempo de análise / validação de consulta do SQL Server
- Cache do plano de consulta do SQL Server
Para o item 1, a realidade é que você adicionará / alterará o código para usar qualquer nova coluna que possa adicionar de qualquer maneira, portanto é uma lavagem.
Para o item 2, a diferença raramente é suficiente para levá-lo a um tamanho ou número de pacotes de rede diferente. Se você chegar ao ponto em que o tempo de transmissão da instrução SQL é o problema predominante, provavelmente precisará reduzir a taxa de instruções primeiro.
Para o item 3, NÃO há economia, pois a expansão do *
mesmo deve ocorrer de qualquer maneira, o que significa consultar o esquema da tabela (s) de qualquer maneira. Realisticamente, a listagem das colunas incorrerá no mesmo custo, pois elas precisam ser validadas com relação ao esquema. Em outras palavras, esta é uma lavagem completa.
Para o item 4, quando você especifica colunas específicas, o cache do plano de consulta pode ficar maior, mas apenas se você estiver lidando com diferentes conjuntos de colunas (que não é o que você especificou). Nesse caso, você deseja entradas de cache diferentes porque deseja planos diferentes, conforme necessário.
Portanto, tudo se resume, por causa da maneira como você especificou a pergunta, à resiliência do problema diante de eventuais modificações de esquema. Se você estiver gravando esse esquema na ROM (acontece), um *
é perfeitamente aceitável.
No entanto, minha orientação geral é que você deve selecionar apenas as colunas necessárias, o que significa que, às vezes , parecerá que você está pedindo todas elas, mas os DBAs e a evolução do esquema significam que algumas novas colunas podem aparecer que podem afetar muito a consulta .
Meu conselho é que você SEMPRE SELECIONE colunas específicas . Lembre-se de que você é bom no que faz repetidas vezes; portanto, adquira o hábito de fazer o que é certo.
Se você está se perguntando por que um esquema pode mudar sem alterar o código, pense em termos de log de auditoria, datas de validade / validade e outras coisas semelhantes que são adicionadas pelos DBAs para problemas sistemáticos de conformidade. Outra fonte de alterações ocultas são as desnormalizações para desempenho em outras partes do sistema ou nos campos definidos pelo usuário.