Когда в запросе используется индекс columnstore, SQL Server может использовать пакетный режим. В документации мало информации о том, что может работать в пакетном режиме, а что нет. Пожалуйста, посмотрите на следующий (мотивирующий) план запроса, где удивительное количество вещей выполняется в пакетном режиме (зеленый):
(Это примерный план. Я использовал реальный план, чтобы убедиться, что реальный режим выполнения действительно пакетный.)
Обратите внимание, что только сторона сборки T1 использует индекс columnstore. Все входы датчиков (T2 и T3) являются хранилищами строк. Их данные, похоже, переходят в пакетный режим. Я всегда думал, что пакетный режим используется для потока данных, который проходит только через зонд.
Кажется, что данные могут переходить в пакетный режим, даже если они не происходят из индекса columnstore. Возникает вопрос: почему SQL Server также не использует пакетный режим для запросов только для хранения строк? Может быть полезно для некоторых из них. Является ли использование индекса columnstore формальным требованием, необходимым для того, чтобы SQL Server рассматривал пакетный режим? Можем ли мы добавить фиктивную таблицу с нулевой строкой с индексом columnstore для запуска пакетного режима и повышения производительности?
Что именно может работать в пакетном режиме с SQL Server 2014?
Ответы:
SQL Server 2014 добавляет следующее в исходный список операторов пакетного режима:
SQL Server 2012 был очень ограничен в использовании пакетных операторов. Планы пакетного режима имели фиксированную форму, основывались на эвристике и не могли перезапустить пакетный режим после перехода к обработке в строчном режиме.
SQL Server 2014 добавляет режим выполнения (пакетный или строковый) в общую структуру свойств оптимизатора запросов, что означает возможность перехода в пакетный режим и из него в любой точке плана. Переходы осуществляются невидимыми адаптерами режима выполнения в плане. Эти адаптеры связаны с определенными затратами на ограничение количества переходов, вводимых во время оптимизации. Эта новая гибкая модель известна как выполнение в смешанном режиме.
Адаптеры режима выполнения можно увидеть в выходных данных оптимизатора (хотя, к сожалению, в планах выполнения, видимых пользователю) с недокументированным TF 8607. Например, для запроса, подсчитывающего строки в хранилище строк, было зафиксировано следующее:
Это сегодня, да. Одна из возможных причин этого ограничения заключается в том, что оно естественным образом ограничивает обработку в пакетном режиме для Enterprise Edition.
Да, это работает. По этой же причине я также видел людей, перекрестно соединяющихся с кластерным индексом columnstore из одной строки. Предложение, которое вы сделали в комментариях к левому соединению с фиктивной таблицей columnstore на false, просто потрясающе.
План с фиктивным левым внешним соединением:
Правда.
Лучшими официальными источниками информации являются описанные индексы Columnstore и SQL Server Columnstore Performance Tuning .
У MVP SQL Server Нико Нойгебауера есть потрясающая серия на columnstore в целом здесь .
В статье Microsoft Research « Улучшения хранилищ столбцов SQL Server» (pdf) есть некоторые технические подробности об изменениях 2014 года, хотя это не официальная документация по продукту.
источник