Was genau kann ab SQL Server 2014 im Batch-Modus ausgeführt werden?
SQL Server 2014 fügt der ursprünglichen Liste der Stapelmodusoperatoren Folgendes hinzu:
- Hash Outer Join (einschließlich Full Join)
- Hash Semi Join
- Hash Anti Semi Join
- Union All (nur Verkettung)
- Skalar-Hash-Aggregat (keine Gruppierung nach)
- Batch Hash Table Build entfernt
Es scheint, dass Daten in den Stapelmodus übergehen können, auch wenn sie nicht aus einem Columnstore-Index stammen.
Die Verwendung von Stapeloperatoren in SQL Server 2012 war sehr eingeschränkt. Stapelmoduspläne hatten eine feste Form, stützten sich auf Heuristiken und konnten den Stapelmodus nach dem Übergang zur Zeilenmodusverarbeitung nicht neu starten.
SQL Server 2014 fügt den Ausführungsmodus (Stapel oder Zeile) zum allgemeinen Eigenschaftenframework des Abfrageoptimierers hinzu, sodass der Übergang in den Stapelmodus und aus dem Stapelmodus an jedem Punkt im Plan in Betracht gezogen werden kann. Übergänge werden von unsichtbaren Ausführungsmodusadaptern im Plan implementiert. Mit diesen Adaptern sind Kosten verbunden, um die Anzahl der während der Optimierung eingeführten Übergänge zu begrenzen. Dieses neue flexible Modell wird als Mixed Mode Execution bezeichnet.
Die Ausführungsmodusadapter sind in der Ausgabe des Optimierers (obwohl leider nicht in vom Benutzer sichtbaren Ausführungsplänen) mit undokumentiertem TF 8607 zu sehen. Für eine Abfrage, die Zeilen in einem Zeilenspeicher zählt, wurde beispielsweise Folgendes erfasst:
Ist die Verwendung eines Columnstore-Index eine formale Anforderung, die erforderlich ist, damit SQL Server den Batch-Modus berücksichtigt?
Es ist heute, ja. Ein möglicher Grund für diese Einschränkung ist, dass dadurch die Stapelverarbeitung auf die Enterprise Edition beschränkt wird.
Könnten wir vielleicht eine Nullzeilen-Dummy-Tabelle mit einem Columnstore-Index hinzufügen, um den Batch-Modus zu induzieren?
Ja das funktioniert Ich habe auch Leute gesehen, die sich aus genau diesem Grund mit einem einzeiligen Clustered Columnstore-Index kreuzten. Der Vorschlag, den Sie in den Kommentaren zu left join zu einer Dummy-Columnstore-Tabelle auf false gemacht haben, ist grandios.
-- 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;
Planen Sie mit der linken äußeren Dummy-Verknüpfung:
Die Dokumentation ist dünn
Wahr.
Die besten offiziellen Informationsquellen sind die beschriebenen Columnstore-Indizes und die SQL Server-Optimierung der Columnstore-Leistung .
SQL Server MVP Niko Neugebauer hat eine tolle Serie auf columns im Allgemeinen hier .
Es gibt einige gute technische Details zu den Änderungen von 2014 im Microsoft Research Paper, Verbesserungen an SQL Server-Spaltenspeichern (pdf), obwohl dies keine offizielle Produktdokumentation ist.