Was genau kann SQL Server 2014 im Batch-Modus ausführen?

21

Wenn ein Columnstore-Index in einer Abfrage verwendet wird, kann SQL Server den Stapelverarbeitungsmodus verwenden. Die Dokumentation ist dünn, was im Batch-Modus ausgeführt werden kann und was nicht. Sehen Sie sich den folgenden (motivierenden) Abfrageplan an, in dem eine überraschende Anzahl von Dingen im Batch-Modus ausgeführt wird (grün):

Bildbeschreibung hier eingeben

(Dies ist ein geschätzter Plan. Ich habe den tatsächlichen Plan verwendet, um zu überprüfen, ob der tatsächliche Ausführungsmodus tatsächlich Batch ist.)

Beachten Sie, dass nur die Build-Seite von T1 einen Columnstore-Index verwendet. Alle Sondeneingänge (T2 und T3) sind Rowstores. Ihre Daten scheinen in den Batch-Modus überzugehen. Ich habe immer gedacht, dass der Batch-Modus nur für den Datenstrom verwendet wird, der auf der Probe-Seite läuft.

Es scheint, dass Daten in den Stapelmodus übergehen können, auch wenn sie nicht aus einem Columnstore-Index stammen. Das wirft die Frage auf: Warum verwendet SQL Server den Batch-Modus nicht auch für reine Rowstore-Abfragen? Könnte für einige von ihnen von Vorteil sein. Ist die Verwendung eines Columnstore-Index eine formale Anforderung, die erforderlich ist, damit SQL Server den Batch-Modus berücksichtigt? Können wir vielleicht eine Nullzeilen-Dummy-Tabelle mit einem Columnstore-Index hinzufügen, um den Batch-Modus zu induzieren und Leistungssteigerungen zu erzielen?

Was genau kann ab SQL Server 2014 im Batch-Modus ausgeführt werden?

usr
quelle
5
Warum verwendet SQL Server den Batch-Modus nicht auch für reine Rowstore-Abfragen? Weil CS ab sofort nur noch den Batch-Modus unterstützt. Könnte für einige von ihnen von Vorteil sein. Ist die Verwendung eines Columnstore-Index eine formale Anforderung, die erforderlich ist, damit SQL Server den Batch-Modus berücksichtigt? Ja, CS ist eine Voraussetzung. Es ist noch ein Verbindungselement aktiv. Implementieren Sie die Stapelmodusunterstützung für den von Neugebauer geöffneten Zeilenspeicher .
Kin Shah
2
2016 gibt es einen neuen möglichen Trick, um den Batch-Modus als BTW sqlmag.com/sql-server/… zu betrachten
Martin Smith

Antworten:

30

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:

Adapter von Reihe zu Reihe

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:

Batch-Modus mit Dummy-Tabelle

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.

Paul White sagt GoFundMonica
quelle