Member 14760154 Ответов: 2

Sql запрос замедляется при использовании локальной переменной


У меня есть проблема с моим запросом ,


Это было быстро, когда я использовал постоянные данные, но медленно, когда я использовал переменную


пример

Выберите * из T_report, где convert(date,created_date) >='2020-05-01'
и конвертировать(дата,created_date)<='2020-05-30'

этот запрос выполняется быстро ,


но когда я использую вот так


объявить @startdate как дату
объявить @enddate как дату

набор 2020-05-01 @даты начала StartDate =''
set @enddate='2020-05-30'

Выберите * из T_report, где convert(date,created_date) >=@startdate
и конвертировать(дата,created_date)<=@enddate

Что я уже пробовал:

как я могу решить эту проблему?

У меня есть попытка использовать опцию(перекомпиляция)

но все равно медленно

Patrice T

Показать структуру таблицы.

2 Ответов

Рейтинг:
7

CHill60

В дополнение к решению 1 - Почему вы конвертируете столбец created_date - эта колонка должна быть типа Date или DateTime

. . . всегда используйте правильный тип данных для работы. . . это может оказать значительное влияние на эффективность, производительность, хранение и дальнейшее развитие базы данных.
Измените схему таблицы, чтобы сделать create_date дата и ваш запрос становится
Select * from T_report where date >= @startdate and created_date <= @enddate
Принимая во внимание convert вызовы функций из предложения WHERE будут иметь большое значение для скорости.
Если вы уже сделали это created_date объявлено как датаВремя затем вместо приведения/преобразования столбца в предложении WHERE поумнейте со своими локальными переменными, т. е.
set @startdate ='2020-05-01'
set @enddate='2020-05-31' -- Note this is the day after the end date!

Select * from T_report where created_date >=@startdate
and created_date<@enddate  -- Note only less than not less than or equal 
Еще одно последнее замечание - это хорошая практика, чтобы перечислить столбцы, которые вы хотите в своем запросе, а не использовать * - это останавливает вас от того, чтобы вас поймали, если схема изменится в дальнейшем


Patrice T

+5

Рейтинг:
15

Patrice T

Select * from T_report where convert(date,created_date) >='2020-05-01'
and convert(date,created_date)<='2020-05-30'

Проблема, которую я вижу, заключается в том, что преобразование выполняется на неправильной стороне условий.
Преобразование должно выполняться на константе, а не на поле данных (created_date).
Разница заключается в том, что компилятор SQL может полностью оптимизировать запрос, когда поле данных остается неизменным в состоянии.