Eu tenho uma consulta construída dinamicamente com uma cláusula where que se parece com isso:
where column in ('a', 'a', 'a', 'b')
Os dados reais são MUITO mais longos com muitas duplicatas, como no exemplo acima, onde a
é repetido três vezes.
Existe um impacto potencial de desempenho para uma WHERE
cláusula muito grande usando um IN
com um grande número de valores, muitos dos quais são duplicados?
Isso é bem fácil de testar.
Habilite os planos de execução "reais" e execute isto:
Os resultados mostram claramente que o SQL Server elimina itens duplicados da
IN (...)
cláusula antes de executar a consulta.Esteja ciente de que, se
IN (...)
contiver um número suficientemente grande de itens duplicados, a consulta poderá ter um desempenho pior do que se essas duplicatas não estivessem presentes. As causas para o baixo desempenho podem incluir:IN
cláusula.IN
cláusula.IN
cláusula pode resultar em maior latência se vários pacotes TCP precisarem ser compilados, enviados e recebidos.Os itens listados acima serão compostos se a consulta estiver sendo enviada ao servidor com muita frequência.
Se a lista for grande o suficiente, o tamanho do texto por si só pode causar problemas de desempenho de outras maneiras, como tempo de compilação (apenas analisando a coisa) e enviando a consulta pela rede. Então, só porque o plano de execução não mostra isso, não significa que esses valores adicionais não possam afetar o desempenho.