SQL Server 2016: агрегатный оконный оператор пакетного типа | Разделители, отличные от UNBOUNDED и CURRENT ROW
SQL Server 2016: агрегатный оконный оператор пакетного типа | Разделители, отличные от UNBOUNDED и CURRENT ROW

SQL Server 2016: агрегатный оконный оператор пакетного типа | Разделители, отличные от UNBOUNDED и CURRENT ROW

❤ 531 , Категория: Новости,   ⚑ 11 Авг 2017г

Содержание:
1. Строки с разделителями UNBOUNDED и CURRENT ROW;
2. RANGE с разделителями UNBOUNDED и CURRENT ROW;
3. Разделители, отличные от UNBOUNDED и CURRENT ROW (Вы читаете данный раздел);
4. Оконные функции смещения, функции LAG и LEAD;
5. Функции FIRST.VALUE и LAST.VALUE.


В случае использования агрегирующих оконных функций с фреймами, среди разделителей которых нет ни UNBOUNDED, ни CURRENT ROW, даже если вы опрашиваете данные в представлении columnstore, при расчете оконных функций всегда найдется дело для операторов построчного режима. И все же часть работы можно поручить операторам пакетного режима.

Допустим, вы вычисляете агрегирующую оконную функцию с фреймом, который начинается со спецификации UNBOUNDED PRECEDING (ускоренная оптимизация), но не заканчивается CURRENT ROW; например: SUM (val) с фреймом ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING. Если вы адресуете запрос к таблице Transactions (данные в представлении rowstore), то получите оптимизацию, подобную той, которая выполнялась в запросе Query 1 на рисунке ниже, поскольку она все еще считается ускоренной. Естественно, это возможно только при наличие стабильного подключения к Интернету, так что рекомендую прикупить качественный и надежный роутер — к примеру, на Хиаоми.express.

Если вы направите запрос к таблице TransactionsCS (данные в представлении columnstore), то та часть плана, которая вычисляет количество строк, будет оптимизироваться с помощью оператора пакетного режима Window Aggregate, однако собственно агрегат будет оптимизирован с помощью традиционных операторов построчного режима для случаев с применением ускоренного варианта.

Если же вы адресуете запрос к таблице TransactionsDCS (rowstore плюс фиктивный индекс columnstore), оптимизатор просто выберет вариант с обработкой всех данных в построчном режиме, и вы получите план, подобный плану выполнения запроса Query 1 на рисунке выше.

Если фрейм не будет начинаться со спецификации UNBOUNDED PRECEDING, формально он не будет относиться к категории фреймов, подлежащих ускоренной оптимизации. Однако в случае, если агрегат рассматривается как накопительный (таковыми, скажем, считаются SUM, COUNT, AVG, но не MIN и МАХ), оптимизатор может выполнить один неускоренный расчет на базе двух ускоренных расчетов; например, расчет SUM (val) с фреймом ROWS BETWEEN 99 PRECEDING AND CURRENT ROW может быть выполнен как SUM (val) с фреймом ROWS UNBOUNDED PRECEDING минус SUM (val) с фреймом ROWS BETWEEN UNBOUNDED PRECEDING AND 100 PRECEDING. Запрос в коде выше (я буду называть его Query 7) к таблице Transactions (rowstore) демонстрирует данную стратегию с использованием оптимизации в построчном режиме данных в представлении row store.

План выполнения данного запроса показан на рисунке выше.

В верхней части плана вычисляется агрегат ComulativeBottom (ROWS UNBOUNDED PRECEDING), а в нижней части — агрегат CumulativeTop (ROWS BETWEEN UNBOUNDED PRECEDING AND 100 PRECEDING). Следующий за этим оператор Compute Scalar вычитает значение CumulativeTop из значения CumulativeBottom, в результате чего получается конечный агрегат. Вот статистические данные, полученные мною входе выполнения данного запроса: продолжительность — 59 секунд, процессор — 59 секунд, логические операции считывания — 31 К, записи — 0.


Продолжение следует…


По теме: ( из рубрики Новости )

Оставить отзыв

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*
*

12 − восемь =

Похожие записи

наверх