SQL-запрос обрабатывает параметры даты по-разному - PullRequest
5 голосов
/ 23 февраля 2012

Итак, у нас есть простой запрос, который выполняется с объединением нескольких таблиц, и мы ограничиваем эти данные датой. Эти запросы являются частью нашей нагрузки хранилища данных и являются критичными по времени. Мы заметили огромную разницу в скорости выполнения и планах выполнения, когда мы перешли от использования даты в предложении 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-секундная разница?

/ * Редактировать * /

Два КЭП

1st Query with dates in Where

2nd Query with dates in join

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Я думаю, что вы сталкиваетесь с проблемой сниффинга переменных (или его отсутствия).Это очень подробно объясняется здесь , но суть в том, что при использовании локальных переменных SQL Server не учитывает их значения при построении плана запроса.Когда вы используете временную таблицу, она есть, и поэтому она генерирует гораздо более производительный план.

Несколько способов проверить это:

  • Попробуйте превратить эти переменные в параметры запроса (или sproc paremeters)
  • Попробуйте добавить OPTION (RECOMPILE), как упомянуто в статье.

Ответ на вопрос (почему разница 50-х) является чисто разницей между эффективностьюхороший QP против плохого.

0 голосов
/ 23 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...