Что именно может выполнять SQL Server 2014 в пакетном режиме?

21

Когда в запросе используется индекс columnstore, SQL Server может использовать пакетный режим. В документации мало информации о том, что может работать в пакетном режиме, а что нет. Пожалуйста, посмотрите на следующий (мотивирующий) план запроса, где удивительное количество вещей выполняется в пакетном режиме (зеленый):

введите описание изображения здесь

(Это примерный план. Я использовал реальный план, чтобы убедиться, что реальный режим выполнения действительно пакетный.)

Обратите внимание, что только сторона сборки T1 использует индекс columnstore. Все входы датчиков (T2 и T3) являются хранилищами строк. Их данные, похоже, переходят в пакетный режим. Я всегда думал, что пакетный режим используется для потока данных, который проходит только через зонд.

Кажется, что данные могут переходить в пакетный режим, даже если они не происходят из индекса columnstore. Возникает вопрос: почему SQL Server также не использует пакетный режим для запросов только для хранения строк? Может быть полезно для некоторых из них. Является ли использование индекса columnstore формальным требованием, необходимым для того, чтобы SQL Server рассматривал пакетный режим? Можем ли мы добавить фиктивную таблицу с нулевой строкой с индексом columnstore для запуска пакетного режима и повышения производительности?

Что именно может работать в пакетном режиме с SQL Server 2014?

USR
источник
5
Почему SQL Server также не использует пакетный режим для запросов, хранящих только строки? Потому что CS поддерживает только пакетный режим на данный момент. Может быть полезно для некоторых из них. Является ли использование индекса columnstore формальным требованием, необходимым для того, чтобы SQL Server рассматривал пакетный режим? Да, CS это требование. Элемент подключения все еще активен. Поддержка пакетного режима агрегата для магазина строк открыта Neugebauer.
Кин Шах
2
В 2016 году появился новый возможный трюк для получения пакетного режима. BTW sqlmag.com/sql-server/…
Martin Smith,

Ответы:

30

Что именно может работать в пакетном режиме с SQL Server 2014?

SQL Server 2014 добавляет следующее в исходный список операторов пакетного режима:

  • Hash Outer join (включая полное соединение)
  • Hash Semi Join
  • Hash Anti Semi Join
  • Union All (только объединение)
  • Скалярный хэш-агрегат (без группировки по)
  • Пакетная сборка хеш-таблицы удалена

Кажется, что данные могут переходить в пакетный режим, даже если они не происходят из индекса columnstore.

SQL Server 2012 был очень ограничен в использовании пакетных операторов. Планы пакетного режима имели фиксированную форму, основывались на эвристике и не могли перезапустить пакетный режим после перехода к обработке в строчном режиме.

SQL Server 2014 добавляет режим выполнения (пакетный или строковый) в общую структуру свойств оптимизатора запросов, что означает возможность перехода в пакетный режим и из него в любой точке плана. Переходы осуществляются невидимыми адаптерами режима выполнения в плане. Эти адаптеры связаны с определенными затратами на ограничение количества переходов, вводимых во время оптимизации. Эта новая гибкая модель известна как выполнение в смешанном режиме.

Адаптеры режима выполнения можно увидеть в выходных данных оптимизатора (хотя, к сожалению, в планах выполнения, видимых пользователю) с недокументированным TF 8607. Например, для запроса, подсчитывающего строки в хранилище строк, было зафиксировано следующее:

Адаптеры из ряда в ряд

Является ли использование индекса columnstore формальным требованием, необходимым для того, чтобы SQL Server рассматривал пакетный режим?

Это сегодня, да. Одна из возможных причин этого ограничения заключается в том, что оно естественным образом ограничивает обработку в пакетном режиме для Enterprise Edition.

Можем ли мы добавить фиктивную таблицу с нулевой строкой с индексом columnstore для запуска пакетного режима?

Да, это работает. По этой же причине я также видел людей, перекрестно соединяющихся с кластерным индексом columnstore из одной строки. Предложение, которое вы сделали в комментариях к левому соединению с фиктивной таблицей columnstore на false, просто потрясающе.

-- Demo the technique (no performance advantage in this case)
--
-- Row mode everywhere
SELECT COUNT_BIG(*) FROM dbo.FactOnlineSales AS FOS;
GO
-- Dummy columnstore table
CREATE TABLE dbo.Dummy (c1 int NULL);
CREATE CLUSTERED COLUMNSTORE INDEX c ON dbo.Dummy;
GO
-- Batch mode for the partial aggregate
SELECT COUNT_BIG(*) 
FROM dbo.FactOnlineSales AS FOS
LEFT OUTER JOIN dbo.Dummy AS D ON 0 = 1;

План с фиктивным левым внешним соединением:

Пакетный режим с фиктивным столом

Документация тонкая

Правда.

Лучшими официальными источниками информации являются описанные индексы Columnstore и SQL Server Columnstore Performance Tuning .

У MVP SQL Server Нико Нойгебауера есть потрясающая серия на columnstore в целом здесь .

В статье Microsoft Research « Улучшения хранилищ столбцов SQL Server» (pdf) есть некоторые технические подробности об изменениях 2014 года, хотя это не официальная документация по продукту.

Пол Уайт говорит, что GoFundMonica
источник