Eu uso o repositório de consultas para obter uma visão geral das consultas executadas em nossos bancos de dados e para gerar testes de desempenho nos quais executo essas consultas em paralelo em vários hosts.
Minha tarefa é testar quantos usuários simultâneos podemos sustentar antes que os tempos de resposta do banco de dados aumentem.
Em todos os bancos de dados que examinei com armazenamento de consulta, os planos de consulta XML incluíam uma tag "ParameterList" da qual li todos os parâmetros para a consulta.
Agora me deparei com um banco de dados onde nem uma única consulta capturada no repositório de consultas tem seus valores de parâmetro listados no plano de consulta.
Qual é a razão disso?
Se for relevante: O banco de dados em questão é usado pelo Microsoft Dynamics.
O servidor é 13.0.4259.0. Nível de compatibilidade do banco de dados é 2016(130')
As consultas no repositório de consultas têm a seguinte aparência:
(@0 int,@1 nvarchar(20),@2 int)SELECT "39"."timestamp",...... WITH(READUNCOMMITTED)
ON ("39"."Document Type" = "39_e1"."Document Type")
AND ("39"."Document No_" = "39_e1"."Document No_")
AND ("39"."Line No_" = "39_e1"."Line No_")
WHERE ("39"."Document Type"=@0
AND "39"."Document No_"=@1 AND "39"."Line No_"=@2)
OPTION(OPTIMIZE FOR UNKNOWN)
feio
O uso da dica otimizar para desconhecido removerá a lista de parâmetros do XML do plano de consulta da mesma forma que o uso de variáveis locais. Observe que isso se aplica apenas a variáveis locais em planos em cache e planos no repositório de consultas. Eles ainda aparecerão nos planos de execução reais.
desconcertante
OPTIMIZE FOR UNKNOWN
é considerada a pior prática pela maioria das pessoas que se preocupam com o desempenho do banco de dados.Ele pode ser desabilitado nas configurações do Dynamics globalmente junto com outras opções bizarras de dicas de consulta.
Quando
OPTIMIZE FOR UNKNOWN
ouUSE HINT ('DISABLE_PARAMETER_SNIFFING')
é usado, ou a opção de configuração com escopo do banco de dados é definida para não realizar a detecção de parâmetros, a Lista de Parâmetros aparece apenas em planos de pós-execução ('reais') executados localmente.O cache do plano e o armazenamento de consulta contêm uma versão do plano sem a Lista de Parâmetros . Este parece ser um comportamento intencional, provavelmente porque os planos não dependem de valores de parâmetros nesses casos. Alguém poderia argumentar que isso é inútil, mas é o que é.
Há uma opção para produzir um plano com base nas estatísticas de distribuição média, mantendo a Lista de Parâmetros : Habilitar o sinalizador de rastreamento documentado 4136 em vez de usar as dicas de consulta. Consulte KB980653 para obter detalhes.
Isso pode ser feito no nível da consulta
OPTION (QUERYTRACEON 4136)
ou habilitado nos escopos de sessão, global e de inicialização.O sinalizador de rastreamento 4136 requer permissões de administrador para definir, mas se as consultas forem conhecidas com antecedência, você poderá usar um guia de plano para aplicar o sinalizador de rastreamento como uma dica de consulta sem que o chamador precise dessas permissões elevadas.
No SQL Server 2022, é possível aplicar
OPTIMIZE FOR UNKNOWN
ouUSE HINT('DISABLE_PARAMETER_SNIFFING')
como uma dica de armazenamento de consulta , mantendo a lista de parâmetros .