#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-й запрос. Спасибо.