Eu rotineiramente "esfrego" os parâmetros dos meus procedimentos armazenados na parte superior antes de executar a consulta assim:
-- Scrub params
SET @SearchText = NULLIF(@SearchText, '')
SET @ThreadId = NULLIF(@ThreadId, 0)
SET @Hashtag = NULLIF(@Hashtag, '')
Mas então a partir deste artigo eu li o seguinte:
Se o predicado da consulta usar uma variável local, considere reescrever a consulta para usar um parâmetro em vez de uma variável local. O valor de uma variável local não é conhecido quando o Otimizador de Consulta cria o plano de execução de consulta. Quando uma consulta usa um parâmetro, o Otimizador de Consulta usa a estimativa de cardinalidade para o primeiro valor de parâmetro real que é passado para o procedimento armazenado.
Conta como usar uma variável local se o valor for originado de um parâmetro? Gostaria de saber se minha depuração de parâmetro pode afetar a criação do plano de execução da consulta.
Não, o SQL Server ainda verá a referência como um parâmetro, que pode ser rastreado .
Geralmente, o plano para todo o procedimento é compilado (e os parâmetros rastreados) antes do início da execução, portanto, você
SET
não será executado quando o sniffing ocorrer. Uma exceção pode ocorrer se a instrução for recompilada por qualquer motivo após o início da execução do procedimento. Nesse caso, o processo de recompilação verá o novo valor que você definiu.Na maioria dos casos, cada declaração que faz referência a um parâmetro será otimizada com base no valor sniffed, não em quaisquer alterações feitas no procedimento.
Leitura adicional: Parameter Sniffing, Embedding e as opções de RECOMPILE
Isso afeta o estimador de cardinalidade se você usar uma variável diferente e defini-la usando seu parâmetro.
Se você usar o parâmetro diretamente, ele não afetará o estimador de cardinalidade.
Fiz um teste rápido no banco de dados do stackoverflow e se você olhar isso, vai notar que quando você usa a variável local, o número estimado de linhas é diferente então, mas o mesmo de quando você configura o parâmetro com ele mesmo.