Isso pode ser estúpido e parecer que estou voltando a tentar entender o básico.
Então eu crio uma tabela de teste como abaixo e crio um índice clusterizado nela
create table test( c1 int)
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 1
SET @Upper = 10000
while 1=1
begin
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
insert into test SELECT @Random
end
create clustered index cidx on test(c1)
Agora estou executando a consulta abaixo com o plano de execução real em
DECLARE @Min INT
SET @Min = 216 --selected this cause this was a histogram step
select * from test where c1 = @Min
select * from test where c1 = @Min option(recompile)
Então para a primeira consulta o comportamento é o esperado, o número estimado de linhas é calculado a partir do vetor densidade.
Buscar Predicados - Buscar Chaves 1 : Prefixo: [db].[dbo].[test].c1 = Operador Escalar( [@Min] )
Mas, para a segunda consulta, parece que o sql server pode farejar o valor com a opção (recompilar). Eu pensei que o SQL Server não pode farejar variáveis mesmo se usarmos a opção recompilar?
Buscar Predicados - Buscar Chaves 1 : Prefixo: [DB].[dbo].[test].c1 = Operador Escalar( (216) )
Então, como você pode ver pelo número estimado de linhas, o primeiro é 3,2511 que veio do vetor densidade e para o segundo o número estimado de linhas de 7 vem do histograma.
Então é verdade que o SQL Server pode farejar a variável quando recompilamos a consulta ad hoc ou é algo que eu não entendo?
Este comportamento está documentado no tópico Query Hints :