Это похоже на проблему, вызванную перехватом параметров - во время компиляции плана SQL Server «вынюхивает» текущие значения параметров и использует его для оптимизации запроса.Наиболее распространенная проблема, которая может возникнуть, заключается в том, что если запрос выполняется со значением «нечетное» параметра при первом запуске / компиляции, в этом случае план запроса будет оптимизирован для этого значения параметра, однако перехват параметров может вызвать все другие проблемы.
В вашем случае, если запрос выполняется с пустым / нулевым значением для @postcode
, тогда в запросе используется предложение LIKE '%'
, которое может вызвать сканирование таблицы в виде подстановочного знака LIKE
используется в начале фильтра.Похоже, либо план был изначально запущен / скомпилирован с пустым параметром @postcode
, либо SQL Server каким-то образом запутался в этом параметре.
Есть несколько вещей, которые вы можете попробовать:
- Пометьте запрос для перекомпиляции, а затем снова запустите запрос с ненулевым значением для
@postcode
. - «Маска» для параметра, чтобы попытаться предотвратить перехват параметров,
например:
declare @postcode varchar(10) = 'SW14 1xx'
declare @postcode_filter varchar(10) = @postcode + '%'
-- Run the query using @postcode_filter instead of @postcode
Хотя этот запрос выглядит так, как будто он должен вести себя точно так же, я обнаружил, что SQL Server обрабатывает параметры странным образом - правила, когда именно перехват параметроввремя от времени может быть немного странным, поэтому вы можете поэкспериментировать с вариантами, описанными выше.