Estou usando o .NET TableAdapter para executar uma consulta SELECT em meu aplicativo, conforme mostrado abaixo. O problema é que esse tipo de consulta às vezes leva vários minutos para ser executado. No entanto, embora eu tenha testado no servidor SQL, ele retornou o resultado rapidamente. (Fazer SET ARITHABORT ON/OFF
isso OPTION(RECOMPILE)
pode resolver o problema às vezes, mas nem sempre.)
/*The query defined in the designer.cs*/
SELECT Column1, Column2, Column3...
FROM MyTable
WHERE column1 = @var1 AND column2 = @var2
Se eu remover as variáveis para usar literais, isso corrige a velocidade.
SELECT Column1, Column2, Column3...
FROM MyTable
WHERE column1 = 'Billing' AND column2 = 'New'
Usar SqlCommand.ExecuteReader()
também não funciona. Acho que ainda envia os parâmetros como variáveis separadas, para o SQL Server processar.
Por fim, tentei usar variável no SQL Server, mas ela não diminui a velocidade. Portanto, me pergunto se o uso de variável é realmente o problema. (não deveria TableAdapter
substituir as variáveis por literais antes de enviar a consulta?)
DECLARE @status va1= 'Billing'
DECLARE @status var2= 'New'
SELECT Column1, Column2, Column3...
FROM MyTable
WHERE column1 = @var1 AND column2 = @var2
Existe uma maneira de corrigir o desempenho, sem alterar todas as consultas com variáveis para literais?
Ao usar variáveis como @var1 e @var2 em sua consulta, o SQL Server deve gerar um plano de execução de consulta que considere os valores potenciais dessas variáveis. O SQL Server tenta criar um plano adequado para vários valores de parâmetros. Este processo pode levar a um plano de execução abaixo do ideal em alguns casos, especialmente se a distribuição dos dados na sua tabela for desigual.
Por outro lado, quando você usa literais como 'Faturamento' e 'Novo' em sua consulta, o SQL Server pode gerar um plano de execução de consulta específico para esses valores constantes. Isso pode resultar em um plano de execução mais eficiente porque não é necessário considerar diferentes valores possíveis.
Minhas sugestões;
Certifique-se de que as estatísticas das colunas envolvidas na sua consulta estejam atualizadas. Estatísticas desatualizadas podem levar a planos de consulta abaixo do ideal. Você pode usar o comando UPDATE STATISTICS para atualizar estatísticas de tabelas e colunas específicas.
Além disso, você pode limpar o cache para uma consulta específica usando DBCC FREEPROCCACHE, mas use isso com cuidado, pois pode afetar o desempenho geral do servidor. Os planos de consulta armazenados em cache podem se tornar menos eficientes.