Em uma aplicação de produção (C# falando com SQL Server 2014 Standard) existe uma consulta que se parece com esta, abaixo. Na maioria das vezes, ele é executado em milissegundos. Mas, ocasionalmente (para certos valores de @Id
), ele enlouquece e leva um minuto ou mais. Isso é mais longo que o tempo limite do aplicativo, portanto, o aplicativo falha para o usuário.
Nos casos "enlouquece", o conjunto de resultados retornado está corretamente vazio, como em muitos, mas não em todos os outros casos.
Felizmente, isso pode ser reproduzido nos ambientes de produção e desenvolvimento.
O desenvolvedor diz que remover "TOP 1" da consulta e garantir que o aplicativo consuma as linhas extras do conjunto de resultados elimina o problema de desempenho.
O planejador de consulta não sugere nenhum índice quando TOP 1
está presente. (em desenvolvimento).
A alteração da consulta e a correção do aplicativo estão em andamento. A implantação demora um pouco.
Minha pergunta: existe alguma maneira acessível ao DBA de ajustar ou ajustar a instância de produção do SQL Server para superar esse problema antes que a alteração do aplicativo com a nova consulta seja lançada?
SELECT TOP 1
subscription_id
FROM subscription AS sub
JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id
JOIN person_group AS apg ON apg.person_id = bi.person_id
JOIN pplan ON pplan.plan_id = sub.plan_id
JOIN product ON product.product_id = [plan].product_id
JOIN product_attribute ON product_attribute.product_id = product.product_id
WHERE apg.group_id = @Id
AND apg.start_date < GETDATE()
AND (apg.end_date IS NULL OR apg.end_date > GETDATE())
AND (sub.end_date IS NULL OR sub.end_date > GETDATE())
AND product_attribute.attribute_type = 'special feature'
AND product_attribute.attribute_data = '1'
ORDER BY sub.start_date ASC;
Se você não pode alterar a consulta, pode usar um guia de plano.
Teste o desempenho da consulta com
OPTION (QUERYTRACEON 4138)
(precisará de alguém comsysadmin
permissões para tentar isso).Se isso produzir um desempenho satisfatório, você pode aplicá-lo com um guia de plano. Se não produzir um desempenho satisfatório, tente encontrar uma dica que o faça. Possivelmente
OPTION (HASH JOIN, MERGE JOIN)
se loops aninhados inadequados forem o problema. Você pode precisar recorrer àUSE PLAN N'...'
dica.Depois de conhecer as dicas necessárias, você pode aplicá-las usando as informações aqui .
para sorrisos experimente
`> é alterado para >= então não é exatamente a mesma consulta