SQL-запрос и параметр datetime требуют много времени для выполнения - PullRequest
3 голосов
/ 29 октября 2009

У меня есть запрос, который принимает datetime в качестве параметра, и мы заметили, что если вы предоставите параметр datetime через переменную, Query потребуется в 2-3 раза больше времени для выполнения, чем если бы вы жестко закодировали параметр, причина или решение проблемы

Следующий запрос занимает около 5 минут, чтобы вернуть результат

Declare @Date as DateTime   
Set @Date = '01/01/2009'

Select * from TempTable where effdate = @Date

Пока как

  Select * from TempTable where effdate = '01/01/2009'

возвращается через 10–20 с

Не всегда у меня будет индекс по столбцу, с помощью которого я хочу выполнить поиск.

В соответствии с рекомендациями kevchadders, я увидел огромную разницу в плане выполнения. Запрос с переменной даты выполнял сканирование кластерного индекса, а другой выполнял поиск индекса.

Ответы [ 6 ]

3 голосов
/ 29 октября 2009

Обычный подозреваемый - несоответствие типа данных, то есть столбец smalldatetime или varchar. «datetime» имеет более высокий приоритет, поэтому столбец будет преобразован.

1 голос
/ 29 октября 2009

Я видел это раньше и обошел это, используя таблицу параметров, а не переменную.

if object_id('myParameters') is not null drop table myParameters
Select cast('1996-05-01' as datetime) as myDate into myParameters

Select * from TempTable where effdate = (select max(myDate) from myParameters)
1 голос
/ 29 октября 2009

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

Даже 30-40 секунд - это много для такого простого запроса. Если у вас есть индекс на поле, вы должны получить результат через несколько секунд даже для очень большой таблицы.

Для фактического запроса вы, конечно, должны указать поля, которые вы хотите вернуть, вместо использования "select *". Возвращая только те данные, которые вам действительно нужны, вы можете уменьшить объем данных, отправляемых с сервера базы данных. Например, в этом запросе вы знаете, какое значение будет иметь поле effdate для всех строк в результате, поэтому нет необходимости возвращать его.

1 голос
/ 29 октября 2009

Вы смотрели на План выполнения на обоих, чтобы увидеть, есть ли в этом какие-нибудь подсказки?

0 голосов
/ 23 октября 2013

Это может быть проблемой «перехвата параметров». Попробуйте включить строку:

OPTION (RECOMPILE)

в конце вашего запроса SQL.

Здесь есть статья, объясняющая, что такое сниффинг параметров: http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

0 голосов
/ 29 октября 2009

При таком простом запросе время возврата должно быть намного, НАМНОГО ниже. Попробуйте выполнить запрос с EXPLAIN, т.е. EXPLAIN Select * from TempTable where effdate = '01/01/2009'. Если нет указаний на используемый индекс, вы должны добавить его ( см. Учебник в Интернете по оптимизации запросов).

CREATE INDEX 'date_index' ON `TempTable` (`effdate`);

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

...