Во-первых, я прошу прощения, если этот вопрос является общим ... Я не могу найти правильные условия для поиска ...Оптимизация запросов с переменными
У меня есть несколько большая таблица, которая инкрементный ID и вставленное значение datetime
. На нем есть пара индексов, включая первичный ключ на ID
и некластеризованный индекс по вставленному времени и идентификатору. Так что, когда я пишу запрос вроде следующего, это очень быстро:
select min(ID), max(ID)
from tbl
where inserted between '2015-10-07' and '2015-10-08'
Однако, если я variablize в случаях, когда условия пункта (как показано ниже), это совсем немного медленнее:
declare @sTime datetime, @eTime datetime
select @sTime = '2015-10-07', @eTime = '2015-10-08'
select min(ID), max(ID)
from tbl
where inserted between @sTime and @eTime
Когда Я смотрю на два плана запросов, я вижу очевидную проблему. В первом запросе используется один seek
для некластеризованного индекса введенного времени и идентификатора. Однако второй запрос вместо этого выполняет 2 scans
на первичный ключ (который является только идентификатором).
Итак, мой вопрос заключается в два раза:
- Почему SQL Server выполняет эти оптимизации и
- как я могу это исправить?
[Параметры] (http://www.sommarskog.se/query-plan-mysteries.html#varparamreplace) результирующий автономный запрос совсем другой, и SQL Server может делать ** более точные оценки с константами вместо переменных **, и, следовательно, прийти к лучшему плану. Вы можете попытаться использовать другой план с помощью [Гиды планов] (http://www.sommarskog.se/query-plan-mysteries.html#planguides) – lad2025
Просто точка в том, что в зависимости от диапазона запросов оптимизатор запросов должен выбирать между index seek vs index scan. – lad2025
@ lad2025, в то время как я не думаю, что ссылка параметров имеет какое-то отношение к моему сценарию (это не хранимая процедура), похоже, что 'option (recompile)' должен работать в MSSQL 2008 и newer ... что, по крайней мере, подразумевает, что существует разумное решение, продвигающееся вперед ... – chezy525