Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O parâmetro não funciona tão bem ao codificar o valor


EDITAR RESUMO Por um pedido de Damien_The_Unbeliever

O objetivo é obter as melhores/mais informações sobre o valor da variável para o SQL ANTES de o plano ser criado, geralmente o sniffing de parâmetros faz isso. Pode haver uma razão pela qual a detecção de parâmetros foi 'desativada' neste caso. Sem ver uma representação melhor do código real, não podemos realmente dizer qual é a solução ou por que o problema existe. Tente as coisas abaixo para forçar as áreas afetadas a gerar planos usando valores reais.

*VERSÃO LONGA COM MAIS DETALHES *

Este é o seu proc armazenado real? Você tem valores padrão para seus parâmetros? Se sim, quais são eles?

A detecção de parâmetros pode ajudar - mas precisa ter valores de parâmetros típicos para criar bem o plano e, se não, não ajudará realmente ou criará um plano ruim com base no valor de parâmetro não típico. Portanto, se uma variável tiver um valor padrão nulo ou um valor que não seja um valor típico na primeira vez que for executada e o plano compilado - ela cria um plano ruim.

Se alguém escreveu este sproc - eles podem ter 'desativado' intencionalmente o parâmetro sniffing com as variáveis ​​locais por um motivo. As regras de negócios podem exigir essas estruturas variáveis.

O objetivo é obter as melhores/mais informações sobre o valor da variável para SQL ANTES de o plano ser criado e, geralmente, o Parameter Sniffing faz isso. Mas há coisas que podem fazer com que ele afete negativamente o desempenho, e pode ser por isso que ele está 'desativado'. Ainda parece que o plano está sendo criado com valores atípicos para os parâmetros ou ainda com informações insuficientes - usando o sniffing de parâmetros ou não.

Tente chamar a consulta dentro do sproc com Use sp_executesql para executar as consultas afetadas, forçando-a a gerar um plano para essa área com as variáveis ​​reais e veja se fica melhor. Esta pode ser sua solução se você tiver que ter esse tipo de valor de parâmetro irregular - crie procs armazenados que executem as partes afetadas e chame-os posteriormente de dentro do procedimento armazenado - depois que a variável tiver recebido um valor típico.

Sem ver uma representação melhor do código real, é difícil ver qual é o problema. Espero que esta informação ajude -