Що саме SQL Server 2014 може виконувати в пакетному режимі?


21

Коли в запиті використовується індекс стовпців, SQL Server може використовувати пакетний режим. Документація відрізняється тим, що може працювати в пакетному режимі, а що не можна. Будь ласка, подивіться на наступний (мотивуючий) план запитів, де у пакетному режимі (зелений колір) виконується дивовижна кількість речей:

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

(Це приблизний план. Я використовував фактичний план, щоб перевірити, чи дійсний режим виконання дійсно пакетний.)

Зауважимо, що лише інкасаційна частина T1 використовує індекс зберігання стовпців. Усі входи зонду (T2 і T3) є рядками. Їх дані, здається, переходять у пакетний режим. Я завжди думав, що пакетний режим використовується для потоку даних, який проходить тільки через зонд.

Здається, що дані можуть переходити в пакетний режим, навіть якщо вони не походять з індексу стовпців стовпців. Постає питання: Чому SQL Server також не використовує пакетний режим для запитів, що стосуються лише рядків? Може бути корисним для деяких з них. Чи використання індексу стовпців стовпців є формальною вимогою, необхідною для того, щоб SQL Server розглядав пакетний режим? Чи не можемо ми додати таблицю фіктивних таблиць із нульовим рядком з індексом стовпців, щоб спонукати пакетний режим та реалізувати підвищення продуктивності?

Що саме може працювати в пакетному режимі, починаючи з SQL Server 2014?


5
Чому SQL Server також не використовує пакетний режим для запитів, що стосуються лише рядків? Тому що CS підтримує лише пакетний режим. Може бути корисним для деяких з них. Чи використання індексу стовпців стовпців є формальною вимогою, необхідною для того, щоб SQL Server розглядав пакетний режим? Так, CS - це вимога. Є ще активний елемент підключення. Підтримка пакетного режиму для магазину рядків, відкрита компанією Neugebauer.
Кін Шах

2
У 2016 році є новий можливий трюк, щоб розглянути пакетний режим BTW sqlmag.com/sql-server/…
Мартін Сміт

Відповіді:


30

Що саме може працювати в пакетному режимі, починаючи з 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), хоча це не офіційна документація на продукт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.