Acabei de notar que em nossos bancos de dados temos uma visão que converte uma BIT
coluna em um arquivo INT
. A tabela subjacente tem uma coluna computada BIT
que é definida assim:
IncludeInJobTotals as (CONVERT(bit,
case
when FL.[Status]=(5)
or FL.[Status]=(3)
or FL.[Status]=(2)
then (1)
else (0)
end,(0)))
Em uma visão que usa IncludeInJobTotals
, estamos lançando-o como um arquivo INT
. Existem problemas de desempenho que isso pode causar? Que outros problemas podem existir? Há alguma razão para usar INT
mais BIT
?
Para responder à pergunta geral primeiro, sim, o tipo de dados nas visualizações pode afetar o desempenho. Vamos simular alguns dados para ilustrar um exemplo trivial:
As duas consultas a seguir retornam os mesmos resultados, mas o desempenho é muito diferente:
Se eu fizer o tipo errado de conversão de tipo de dados, o filtro não será mais sargável . Ele não pode usar um índice na coluna e a oferta de estimativas de cardinalidade sofre porque o histograma não pode ser usado.
Importa no seu caso onde você lança uma
BIT
coluna para umINTEGER
? Podemos filtrar nas colunasIncludeInJobTotals
eIncludeInJobTotals_INT
na exibição para executar alguns testes. Com base na precedência do tipo de dados , devemos esperar que aBIT
seja convertido em anINTEGER
em qualquer comparação entre aBIT
e anINTEGER
. O SQL Server deve ser capaz de fazer uma conversão implícita entre eles , então acho que será difícil encontrar um problema de desempenho.Como estamos lidando com uma coluna de bits, não há muitos casos de teste possíveis para filtros simples. Se eu filtrar em qualquer coluna da exibição procurando por linhas com um
0
valor, sempre recebo buscas de índice e uma estimativa de cardinalidade correta:Se eu filtrar em qualquer coluna da exibição procurando por linhas com um
1
valor, sempre recebo uma verificação de tabela e uma estimativa de cardinalidade correta:A procura de valores fora do intervalo também funciona como esperado:
Eu não me preocuparia com o desempenho para esse tipo de alteração de tipo de dados. É difícil imaginar um cenário no qual você teria problemas de desempenho. No entanto, é importante observar que as consultas que usam a exibição podem retornar resultados diferentes dependendo de como você usa a coluna. O tipo de dados BIT se comporta de maneira diferente de
INT
:Voltando à lista de precedência de tipo de dados, um
VARCHAR
valor será convertido em umBIT
valor. Isso significa que uma maneira de obter resultados diferentes é filtrar ou unir umVARCHAR
valor fora do intervalo:Talvez seu aplicativo nunca faça isso, mas o que você quer que aconteça nesse cenário? Eu me concentraria na correção aqui sobre o desempenho.