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

Агрегатный оконный оператор пакетного режима в SQL Server 2016 | Агрегатные оконные функции без фрейма. Часть II

Агрегатный оконный оператор пакетного режима в SQL Server 2016 | Агрегатные оконные функции без фрейма. Часть II

Чтобы протестировать быстродействие выполнения того же запроса средствами обработки в пакетном режиме данных в формате columnstore, нужно просто взять в качестве целевой таблицу TransactionsCS, вот таким образом (назовем этот запрос Query 2):
SELECT actid, tranid, val,

  SUM(val) OVER(PARTITION BY actid) AS acttotal

FROM dbo.TransactionsCS;

Агрегатный оконный оператор пакетного режима в SQL Server 2016 | Агрегатные оконные функции без фрейма. Часть II
План для запроса Query 2 (пакетный режим, применяемый к данным в формате columnstore)

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

Прежде чем мы углубимся в рассмотрение этого плана, обратите внимание на его восхитительную простоту по сравнению с предыдущим. Здесь мы впервые сталкиваемся с новым оператором пакетного режима Window Aggregate в действии. Этот план параллельный, и он использует средства обработки в пакетном режиме данных в формате columnstore. Он сканирует данные из индекса columnstore; отсюда и небольшое число операций считывания (всего 6 Кбайт). Однако, поскольку данные columnstore не являются упорядоченными, для их упорядочения в соответствии с содержимым разделяющего столбца (actid) приходится использовать оператор Sort. Для смягчения удара разработчики SQL Server 2016 применяют новый оператор пакетного режима Sort.



Почти все магические превращения происходят с появлением нового оператора пакетного режима Window Aggregate. Он заменяет всю старую логику операторами Repartition Streams, Segment, Spool, Aggregate и операторами объединений. Как разъясняют члены группы разработчиков SQL. данный оператор выполняется параллельно (хотя может выполняться и последовательно, что я продемонстрирую ниже) и производит упорядоченные вычисления «в потоковом режиме» в виде процесса, осуществляемого в несколько проходов (для сохранения высокой степени параллелизма). Этот прием известен тем, что в нем используется упорядоченная обработка на графическом процессоре GPU (такая же, как для обработки видеопотока). Одна из важнейших особенностей процесса — отмена необходимости использования старого каталога за счет сохранения в памяти «оконных строк» и выполнения сверхбыстрой обработки в этом окне с применением выделенного пути к коду для каждой функции. Перефразируя слова персонажа из фильма «Матрица», нет никакого каталога! Данный оператор демонстрирует значительно усовершенствованное (по сравнению со старыми вычислениями в построчном режиме) масштабирование параллелизма с использованием DOP n вместо DOP 1.

Далее план предусматривает применение оператора Compute Scalar для возвращения значения NULL из агрегатной функции, когда счетчик строк имеет значение 0, и, наконец, оператора Gather Streams для сбора нескольких потоков в один с последующим возвращением его источнику вызова.

Приведу статистические данные по выполнению этого запроса: продолжительность — 7 секунд, процессор — 13 секунд, логические операции считывания — 6 Кбайт, записи — 0. Время выполнения запроса сократилось с 47 до всего лишь 7 секунд! Значительно уменьшилась и интенсивность использования процессора. Количество операций считывания снизилось, объем данных не 20 Мбайт, а всего лишь 6 Кбайт. Количество операций записи упало до 0, поскольку данный план не предусматривал использования дискового каталога.

Самый дорогостоящий компонент этого плана — операция сортировки. Как уже отмечалось, поскольку в формате columnstore упорядоченность данных не сохраняется, возникает необходимость использования оператора Sort для обеспечения упорядочения данных в соответствии с содержимым разделяющего столбца (actid) с помощью оператора Window Aggregate operator.

Агрегатный оконный оператор пакетного режима в SQL Server 2016 | Агрегатные оконные функции без фрейма. Часть II

Если и у вас возникает вопрос, можно ли сочетать достоинства построчного индекса двоичного дерева, отменяющего необходимость явной сортировки в случаях, когда это допускается в связи с простотой запроса, с преимуществами пакетной обработки, могу сказать — да, это возможно. Однако напомню: система SQL Server 2016 исходит из того, что в опрашиваемых таблицах должен наличествовать хотя бы один индекс columnstore. Вспомните, что в число тестовых данных для этой статьи входит таблица TransactionsDCS, аналогичная таблице Transactions (те же данные, тот же построчный кластеризованный индекс двоичного дерева), но дополненная фиктивным пустым фильтрованным некластеризированным индексом columnstore, который позволит оптимизатору рассмотреть возможность использования операторов пакетного режима.

В ваших базах нет ни одного индекса columnstore и теперь вам придется начинать всю работу с SQL Server 2016 самого начала. Но перед этим я предлагаю развеяться и перейти на www.777avtomatov.com. Здесь вы сможете как следует отдохнуть за игрой в топовые слоты и даже возможно выиграть неприличную денежную сумму!


1. Часть I;
2. Часть II (Вы читаете данный раздел);
3. Часть III.

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

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

Поделиться

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

Комментарии

^ Наверх