13.3.26

Как указать Batch Mode для Rowstore, если его нет в плане (Часть 5)

Автор: Luca Biondi, Part 5 – How to Force Batch Mode on Rowstore When SQL Server Doesn’t Choose It

Предыдущая статья: Без новых индексов или изменений схемы - запросы быстрее в 10 раз с Batch Mode для Rowstore (Часть 4)

Давайте пристально изучим Actual Execution Plan, и углубимся в изучение пакетного режима для строчного хранения.

Введение

В Части 4 мы увидели, как пакетный режим для строчного хранения (Batch Mode on Rowstore) может кардинально улучшить производительность запросов без добавления новых индексов или изменения схемы.

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

Сегодня мы рассмотрим:

  • Когда SQL Server решает использовать пакетный режим
  • Как принудительно включить его с помощью USE HINT('ForceBatchMode')
  • Когда пакетный режим может навредить производительности
  • Сравнение строчного и пакетного режимов

Почему эта тема важна

Пакетный режим изначально был представлен для колоночных индексов, но начиная с SQL Server 2019 (уровень совместимости 150+) он также может работать и с обычными строчными таблицами.

Выигрыш в производительности может быть значительным, потому что:

  • Пакетный режим обрабатывает строки векторизованными пакетами
  • Это снижает нагрузку на CPU
  • Улучшает производительность агрегаций и соединений

Но вот ключевая проблема:

Даже если ваш запрос подходит, SQL Server может всё равно выбрать строчный режим.

Это может произойти из-за:

  • Решений, принятых при оценке количества строк
  • Расчётов выделения памяти
  • Пороговых значений в модели стоимости
  • Формы запроса

Если вы полагаетесь только на автоматический выбор, вы можете упустить лёгкие улучшения производительности.

Практические примеры

Стандартный запрос

SELECT CustomerID, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY CustomerID;

Иногда этот запрос выполняется в строчном режиме. Всегда проверяйте план выполнения → Actual Execution Mode.

Принудительное включение пакетного режима

SELECT CustomerID, SUM(Amount) AS TotalAmount
FROM Sales
GROUP BY CustomerID
OPTION (USE HINT('ForceBatchMode'));

Эта подсказка заставляет оптимизатор попытаться выполнить запрос в пакетном режиме.

Сравнительный тест

  • 10+ миллионов строк
  • Агрегация по CustomerID
  • Уровень совместимости 150+
СценарийCPU (мс)Время выполнения (мс)Логические чтения
Строчный режим4200280085 000
Пакетный режим (принудительно)1300110085 000

Тот же объём ввода-вывода. Меньше CPU. Быстрее выполнение.

Воспроизводимая демонстрация

Создание таблицы

CREATE TABLE dbo.Sales
(
    SalesID INT IDENTITY(1,1),
    CustomerID INT,
    Amount MONEY,
    OrderDate DATETIME
);

Включение метрик для бенчмарка

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

Очистка кэша (только для теста!)

CHECKPOINT;
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE;

Никогда не выполняйте это в производственной среде.

Строчный режим против пакетного режима

ХарактеристикаСтрочный режимПакетный режим
ОбработкаСтрока за строкойВекторизованные пакеты
Использование CPUВышеНиже
Идеальная нагрузкаOLTPАналитика

Выводы

  • SQL Server не всегда выбирает пакетный режим автоматически.
  • Вы можете протестировать его с помощью OPTION (USE HINT('ForceBatchMode')).
  • Выигрыш в производительности обычно достигается за счёт эффективности использования CPU.
  • Всегда проводите сравнительное тестирование перед внедрением в производство.




Комментариев нет:

Отправить комментарий