Eu já vi muitas pessoas usarem a função COALESCE no lugar de ISNULL. A partir de pesquisas na Internet, descobri que o COALESCE é o padrão ANSI; portanto, há uma vantagem que sabemos o que esperar ao usá-lo. No entanto, ISNULL parece mais fácil de ler, pois parece mais claro o que está fazendo.
Também percebo que o ISNULL é meio complicado, pois age de maneira diferente em diferentes servidores de banco de dados e em diferentes idiomas.
Tudo isso, na minha opinião, se resume a estilo e padrões. Dado que o estilo é subjetivo, há alguma razão para usar o COALESCE sobre ISNULL (ou vice-versa)? Especificamente, há uma vantagem de desempenho de um sobre o outro?
sql-server
syntax
Richard
fonte
fonte
COALESCE
é avaliada duas vezes.COALESCE
é meramente pouco intuitivo;)Respostas:
COALESCE
é traduzido internamente para umaCASE
expressão,ISNULL
é uma função interna do mecanismo.COALESCE
é uma função padrão ANSI,ISNULL
é T-SQL.As diferenças de desempenho podem surgir quando a escolha influencia o plano de execução, mas a diferença na velocidade da função bruta é minúscula .
fonte
Então
Finalmente, e a parte divertida. O tipo de dados e comprimento / precisão / escala do resultado
Esse último bit é o motivo pelo qual ISNULL geralmente é usado porque é mais previsível (?) E o COALESCE pode adicionar conversões não intencionais de tipo de dados: é daí que vem o bit "mais lento"
Sendo todos os tipos de dados iguais, você não verá nenhuma diferença prática ...
fonte
Como Mark apontou, você será pressionado a encontrar diferenças de desempenho; Eu acho que outros fatores serão mais importantes. Para mim, eu sempre uso COALESCE, e a maior parte disso já foi mencionada por você ou por Mark:
Você também deve ter certeza de que está ciente de como a precedência do tipo de dados é tratada usando as duas funções, se você estiver usando com diferentes tipos de dados / precisões, etc.
Nota
Há uma exceção. Eles são tratados de maneira diferente nas versões atuais do SQL Server:
A
COALESCE
variante, na verdade, será executadasome_aggregate_query
duas vezes (uma vez para verificar o valor e outra para retorná-lo quando diferente de zero), enquantoISNULL
só executará a subconsulta uma vez. Eu falo sobre algumas outras diferenças aqui:fonte