Що саме може працювати в пакетному режимі, починаючи з SQL Server 2014?
SQL Server 2014 додає наступне до оригінального списку операторів пакетного режиму:
- Hash Зовнішнє приєднання (включаючи повне приєднання)
- Hash Semi Join
- Hash Anti Semi Приєднуйся
- Союз усіх (лише конкатенація)
- Скалярний хеш-агрегат (без групи за)
- Видалено пакетний хеш-таблицю
Здається, що дані можуть переходити в пакетний режим, навіть якщо вони не походять з індексу стовпців стовпців.
SQL Server 2012 був дуже обмежений у використанні пакетних операторів. Плани пакетного режиму мали фіксовану форму, спиралися на евристику, і не вдалося перезапустити пакетний режим після того, як був здійснений перехід до обробки рядкового режиму.
SQL Server 2014 додає режим виконання (пакетний чи рядок) до загальної бази властивостей оптимізатора запитів, тобто він може розглянути можливість переходу в пакетний режим і виходу з нього в будь-якій точці плану. Переходи реалізуються невидимими адаптерами режиму виконання в плані. Ці адаптери мають пов’язану з ними вартість, щоб обмежити кількість переходів, введених під час оптимізації. Ця нова гнучка модель відома як змішаний режим виконання.
Адаптери режиму виконання можна побачити у висновку оптимізатора (хоча, на жаль, не у видимих для користувача планах виконання) з недокументованим TF 8607. Наприклад, для запиту підрахунку рядків у сховищі рядків було зроблено наступне:
Чи використання індексу стовпців стовпців є формальною вимогою, необхідною для того, щоб SQL Server розглядав пакетний режим?
Це сьогодні так. Однією з можливих причин цього обмеження є те, що воно, природно, обмежує обробку пакетного режиму на Enterprise Edition.
Чи не можемо ми додати таблицю фіктивних таблиць із нульовим рядком з індексом стовпців, щоб викликати пакетний режим?
Так, це працює. Я також бачив людей, що перетинаються з однорядним кластерним індексом стовпців столу саме з цієї причини. Пропозиція, яку ви зробили в коментарях, щоб приєднатись до таблиці фіктивних стовпчиків на помилках, є приголомшливою.
-- 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 та налаштування продуктивності Columnstore SQL Server .
Тут взагалі на SQL Server MVP Niko Neugebauer є надзвичайна серія .
Існує кілька хороших технічних деталей щодо змін у 2014 році в дослідницькій роботі Microsoft, Покращення стовпців магазинів SQL Server (pdf), хоча це не офіційна документація на продукт.