Новость из категории: Информация

SQL Server: вычисляем предыдущее и следующее значение с условием. Продолжение

SQL Server: вычисляем предыдущее и следующее значение с условием. Продолжение

Полный запрос для вычисления prevdt и nextdt[/center]
SQL Server: вычисляем предыдущее и следующее значение с условием. Продолжение
Результаты шага Stepl

В коде, представленном выше, приведен полный запрос для вычисления как prevdt, так и nextdt. Выходные данные этого запроса показаны в таблице выше (представлены с сортировкой по местоположению и дате). Помните, что нам нужно вычислить разницу в днях между prevdt и dt (назовем эту величину diffprev), и между dt и nextdt (назовем эту величину diffnext). Для этого необходимо задействовать функцию DATEDIFF с входными данными на основе текущей даты и результатов вложенных запросов ТОР. Если вы не хотите предоставлять вложенные запросы непосредственно в качестве входов для функции DATEDIFF, то можно использовать оператор CROSS APPLY и производную таблицу на основе предложения VALUES, чтобы определить псевдонимы prevdt и nextdt в предложении FROM. Предложение FROM логически оценивается до предложения SELECT, поэтому псевдонимы, определенные в предложении FROM, доступны для вычислений в предложении SELECT. В коде, представленном ниже, 5 приводится полное решение, в котором применяется этот подход. Соответствующий план запроса показан на скриншоте ниже.

SQL Server: вычисляем предыдущее и следующее значение с условием. Продолжение
Решение с оператором CROSS APPLY

SQL Server: вычисляем предыдущее и следующее значение с условием. Продолжение
План запроса для решения с оператором ТОР

Обратите внимание, что для каждой строки в таблице Precipitation вы получаете две операции поиска в индексе: одну для вычисления prvdt и другую для вычисления compute nextdt. Результат — очень большое число логических операций чтения. Для выполнения данного запроса на моем компьютере потребовалась 71 секунда; при этом было выполнено 65 844026 логических операций чтения (отчет сеанса расширенных событий). Обратите внимание, что это единственный запрос, выполненный мной на моем ноутбуке. Если этот запрос выполняется на компьютере вместе со множеством других запросов, то возникнет конкуренция из-за большого числа операций ввода-вывода. Вероятно, стоит поискать решение, которое выполняет меньше операций чтения.

SQL Server: вычисляем предыдущее и следующее значение с условием. Продолжение

Часто требуется вычислить только предшествующее или следующее значение, но не оба. На выполнение этой задачи, вычисляя только diffprev и удаляя вычисление diffnext, потребовалось 42 секунды. Тем не менее число операций чтения исчисляется десятками миллионов.


<<К началу статьи

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх