sql подобный запрос выполняется медленно, если используется параметр declare, но быстро, если нет

#sql #sql-server-2008 #sql-like #performance

#sql #sql-server-2008 #sql-подобный #Производительность

Вопрос:

SQL 2008: Это происходит медленно (занимает 1 1/2 минуты):

объявить переменную @p1(50)
set @p1 = '976j%' 
выберите * из invsearch_query, где comparepnfwd похож на @p1

Это занимает меньше секунды:

выберите * из invsearch_query, где comparepnfwd имеет значение '976j%'

Почему???

Комментарии:

1. Взгляните на планы выполнения запросов (или опубликуйте их здесь)

2. Попробуйте привести свой литерал, чтобы увидеть, имеет ли это какое-либо значение ( CAST('976j%' AS VARCHAR(50)) ). Также взгляните на план выполнения, чтобы увидеть различия.

3. comparepnfwd — это переменная (50)

4. ЗАНИМАЕТ МЕНЬШЕ СЕКУНДЫ: выберите * из invsearch_query, где comparepnfwd использует аналогичное приведение (‘976j%’ как varchar(50))

5. @Martin, да, вы правы, медленный выполнял кластеризованное индексное сканирование в главной таблице (да, invsearch_query был представлением), а быстрый выполнял поиск по индексу и перебору клавиш.

Ответ №1:

Я бы предположил, что у вас должен быть непокрытый индекс с ведущим столбцом comparepnfwd , который используется буквальным запросом, но не запросом с переменной.

Вы можете использовать OPTION (RECOMPILE) , чтобы заставить SQL Server перекомпилировать план с учетом фактического значения переменной.

Комментарии:

1. опция (перекомпиляция) сделала 1-й запрос таким же быстрым, как и 2-й запрос. Спасибо.