Что именно может работать в пакетном режиме с 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 года, хотя это не официальная документация по продукту.