Медленный запрос с использованием переменной where DateTime

#sql-server

#sql-сервер

Вопрос:

В настоящее время у меня возникла проблема с одним из моих запросов. Я извлекаю 4 столбца из большой таблицы. Эти 4 таблицы сохраняются в табличной переменной. Запрос работает нормально, но время выполнения проблематично. Когда я жестко кодирую первое условие даты, оно выполняется отлично (около 1-2 секунд). Когда я использую переменную вместо жестко заданной даты, выполнение запроса занимает около 3,5 минут.

Я запускаю MS SQL Server 2003 с этим запросом.

Кто-нибудь знает, что вызывает эту разницу во времени выполнения?

 INSERT INTO @TableVariable
SELECT         Coulmn1, Column2, Column3, Column4
FROM           DatabaseTable

/*This line works almost instantaneously)*/

WHERE        (DateTime > CONVERT(DATETIME, '2014-06-23 00:00:00', 102)) AND (DateTime <= @WeekEndTime)

/*If I use this one, it executes in around 3.5 min and I get the same results*/

WHERE        (DateTime > @WeekStartTime) AND (DateTime < @WeekEndTime)

/*The same slow run time is seen with these lines*/

Declare @testTime varchar(20)

Set @testTime = '2014-06-23 00:00:00'

WHERE        (DateTime > CONVERT(DATETIME, @testTime , 102)) AND (DateTime <= @WeekEndTime)


/*This line is always used*/

GROUP BY column 1
 

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

1. Знаете ли вы, есть ли вторичный некластеризованный индекс для DateTime?

2. Может быть, вам следует спросить того, кто написал этот SQL Server, потому что мы все никогда не видели версию 2003. MS опубликовала версию 7.0, затем 2000, затем 2005, затем 2008. Но нет 2003.

3. Каковы типы данных DateTime и различные переменные в ваших запросах?

4. SQL Server может создавать разные планы выполнения при использовании переменных и жестко закодированных значений. Вы проверили планы выполнения двух разных запросов?

Ответ №1:

SQL Server может создавать разные планы выполнения при использовании переменных и жестко закодированных значений. если вы посмотрите на фактические планы выполнения после выполнения каждого запроса, вы увидите разницу.

Ответ №2:

Является ли ваша переменная @WeekStartTime типом данных DATETIME или String ? У меня была похожая ситуация, и когда я изменил переменную на тип данных DATETIME, все стало намного лучше. Я заметил, что вы также пытаетесь использовать varchar . , , попробуйте DATETIME.