Por que o SQL Server não usa uma procura de índice ao executar uma consulta parametrizada?

3

Quando executo a seguinte consulta no SQL Server 2005, ele usa uma pesquisa de índice, conforme verificado ao visualizar o plano de execução.

SELECT *
FROM   Account
WHERE  Number = '123456789'

Mas quando executo a mesma consulta, mas uso um parâmetro, ela usa uma varredura de índice.

DECLARE @AccountNumber NVarChar(25)
SET @AccountNumber = '123456789'

SELECT *
FROM   Account
WHERE  Number = @AccountNumber

Como essa tabela tem mais de 10 milhões de linhas, a segunda consulta leva mais de 30 segundos, enquanto a primeira consulta leva apenas alguns milissegundos. Eu realmente tenho que ir e mudar todas as minhas consultas para não usar parâmetros?

    
por Stefan Moser 22.07.2009 / 20:10

1 resposta

6

Existem diferenças entre usar constantes e variáveis porque, simplesmente, o SQL Server tenta otimizar para o caso geral.

No entanto, neste caso, meu primeiro pensamento é que a precedência do tipo de dados está causando a conversão implícita. Qual tipo de dados é a coluna Número?

Exemplo: digamos que seja varchar (25). nvarchar tem precedência mais alta que varchar então a coluna é implicitamente convertida antes da comparação.

Eu fui mordido recentemente comparando varchar vs SUSER_SNAME. E eu deveria saber melhor.

    
por 22.07.2009 / 20:16