Почему параметризованная версия этого запроса работает медленнее, чем не параметризованная версия? - PullRequest
6 голосов
/ 19 октября 2010

Пример запроса:

CREATE PROCEDURE dbo.Test (@p varchar(10))
AS
DECLARE @param varchar(10)
SET @param = @p + '%'

SELECT * FROM table1 t1
INNER JOIN table2 t2 on t1.id = tr.id
WHERE t2.desc LIKE @param

У меня есть запрос, аналогичный приведенному выше, и когда я использую его в хранимой процедуре, он выполняется неопределенно долго, без каких-либо выходных данных.Но если я использую тот же запрос, что и

SELECT * FROM table1 t1
INNER JOIN table2 t2 on t1.id = tr.id
WHERE t2.desc LIKE 'A%'  -- notice no parameter here

Это выполняется менее чем за секунду.

Моя таблица2 содержит 140 тыс. Записей, а table1 - около 250 тыс.

Любая идея, что можетбыть причиной того, что оператор работает медленно?

1 Ответ

4 голосов
/ 19 октября 2010

Во время компиляции он не знает, что @param не будет иметь подстановочного знака, поэтому, когда он компилирует пакет, он дает вам план со сканированием, а не поиском.

Возможно, вы можете попробовать OPTION (RECOMPILE) или OPTION (FORCESEEK) (SQL Server 2008), чтобы проверить, дает ли он вам лучший план.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...