Когда я выполняю следующий запрос в 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. И я должен знать лучше.