Назад | Перейти на главную страницу

Почему SQL Server не использует поиск по индексу при выполнении параметризованного запроса?

Когда я выполняю следующий запрос в SQL Server 2005, он использует поиск по индексу, что подтверждается просмотром плана выполнения.

SELECT *
FROM   Account
WHERE  Number = '123456789'

Но когда я запускаю тот же запрос, но использую параметр, он использует сканирование индекса.

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

SELECT *
FROM   Account
WHERE  Number = @AccountNumber

Поскольку в этой таблице более 10 миллионов строк, второй запрос занимает более 30 секунд, а первый - всего несколько миллисекунд. Неужели мне действительно нужно пойти и изменить все мои запросы, чтобы не использовать параметры?

Существуют различия между использованием констант и переменных, потому что SQL Server просто пытается оптимизировать для общего случая.

Однако в этом случае моя первая мысль заключается в том, что приоритет типа данных вызывает неявное преобразование. Какой тип данных имеет числовой столбец?

Пример: скажем, это varchar (25). nvarchar имеет более высокий приоритет, чем varchar, поэтому столбец неявно преобразован перед сравнением.

Меня недавно укусили, сравнивая varchar vs SUSER_SNAME. И я должен знать лучше.