Итак, у нас есть простой запрос, который выполняется с объединением нескольких таблиц, и мы ограничиваем эти данные датой. Эти запросы являются частью нашей нагрузки хранилища данных и являются критичными по времени. Мы заметили огромную разницу в скорости выполнения и планах выполнения, когда мы перешли от использования даты в предложении where к соединению с временной таблицей с датами в.
Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime)
Declare @EndDate DateTime = GetDate()
Select *
From Table A
Inner Join Table B
On A.A = B.A
Where A.Date Between @StartDate AND @EndDate
Упрощенная версия запроса, но возвращает 11 000 строк примерно за 50 секунд.
Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime)
Declare @EndDate DateTime = GetDate()
Select @StartDate StartDate, @EndDate EndDate
Into #Dates
Select *
From Table A
Inner Join Table B
On A.A = B.A
Inner Join #Dates
On A.Date Between StartDate AND EndDate
Возвращает те же 11k строк, но не более секунды. Разница в плане выполнения также заметна, второй запрос полон вложенных циклов, в отличие от хеш-совпадений в первом запросе.
Мой вопрос - почему? Почему 50-секундная разница?
/ * Редактировать * /
Два КЭП