Intelligente Abfrageverarbeitung

Abgeschlossen

In SQL Server 2017 und 2019 und Azure SQL hat Microsoft viele neue Features für die Kompatibilitätsgrade 140 und 150 eingeführt. Viele dieser Features korrigieren bereits Anti-Patterns wie die Verwendung von benutzerdefinierten Skalarwertfunktionen und von Tabellenvariablen.

Diese Features lassen sich unterschiedlichen Kategorien zuordnen:

Screenshot der Architektur für die intelligente Abfrageverarbeitung.

Die intelligente Abfrageverarbeitung umfasst Features, die die vorhandene Workloadleistung mit minimalem Implementierungsaufwand verbessern.

Um Workloads automatisch für die intelligente Abfrageverarbeitung zu berechtigen, ändern Sie den entsprechenden Datenbank-Kompatibilitätsmodus in 150. Beispiel:

ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150;

Adaptive Abfrageverarbeitung

Die adaptive Abfrageverarbeitung umfasst eine Vielzahl von Optionen, die die Abfrageverarbeitung basierend auf dem Ausführungskontext einer Abfrage dynamischer gestalten. Diese Optionen umfassen mehrere Features, die die Verarbeitung von Abfragen verbessern.

  • Adaptive Joins: Die Datenbank-Engine verzögert die Auswahl des Joins zwischen Hash und geschachtelten Schleifen basierend auf der Anzahl der Zeilen, die in den Join aufgenommen werden. Adaptive Joins funktionieren derzeit nur im Batchausführungsmodus.

  • Überlappende Ausführung: Derzeit unterstützt dieses Feature Tabellenwertfunktionen mit mehreren Anweisungen (Multi-Statement Table-Valued Functions, MSTVF). In Versionen vor SQL Server 2017 haben MSTVFs eine festgelegte Zeilenschätzung entweder von einer oder 100 Zeilen verwendet, abhängig von der SQL Server-Version. Diese Schätzung kann zu suboptimalen Abfrageplänen führen, wenn die Funktion viele weitere Zeilen zurückgegeben hat. Bei der überlappenden Ausführung wird eine tatsächliche Zeilenanzahl von MSTVF generiert, bevor der restliche Plan kompiliert wird.

  • Feedback zur Speicherzuweisung: SQL Server generiert eine Arbeitsspeicherzuweisung im anfänglichen Plan der Abfrage, basierend auf den Schätzungen der Zeilenanzahl aus den Statistiken. Eine schwerwiegende Datenschiefe kann zu einer Über- oder Unterschätzung der Zeilenanzahl führen. Dies kann zu mehr Speicherzuweisungen führen, die die Parallelität verringern, oder zu zu geringen Zuweisungen, die dazu führen können, dass die Abfrage einen Überlauf in tempdb ausführt. Mit Feedback zur Speicherzuweisung erkennt SQL Server diese Bedingungen und verringert oder vergrößert den Umfang des Arbeitsspeichers, der der Abfrage zugewiesen wurde, um entweder einen Überlauf oder eine überflüssige Belegung zu vermeiden.

Diese Features werden alle automatisch im Kompatibilitätsgrad 150 aktiviert und erfordern keine weiteren Änderungen.

Verzögerte Kompilierung von Tabellenvariablen

Wie bei MSTVFs weisen Tabellenvariablen in SQL Server-Ausführungsplänen eine feste Zeilenzahlschätzung von einer Zeile auf. Ähnlich wie bei MSTVFs führte diese festgelegte Schätzung zu einer geringeren Leistung, wenn die Variable eine weitaus größere Zeilenanzahl als erwartet enthielt. Mit SQL Server 2019 werden Tabellenvariablen nun analysiert und verfügen über eine tatsächliche Zeilenanzahl. Die verzögerte Kompilierung ähnelt der überlappenden Ausführung für MSTVFs, mit der Ausnahme, dass Sie bei der ersten Kompilierung der Abfrage statt dynamisch innerhalb des Ausführungsplans ausgeführt wird.

Batchmodus im Zeilenspeicher

Der Batchausführungsmodus ermöglicht die Verarbeitung von Daten in Batches anstelle von zeilenweise. Dieses Verarbeitungsmodell wirkt sich sehr stark positiv auf Abfragen aus, die erhebliche CPU-Aufwand für Berechnungen und Aggregationen verursachen. Durch die Trennung von Batchverarbeitung und Columnstore-Indizes können mehr Workloads von der Batchmodusverarbeitung profitieren.

Inlining skalarer benutzerdefinierter Funktionen

In älteren Versionen von SQL Server war die Leistung von Skalarfunktionen aus verschiedenen Gründen unzureichend. Skalare Funktionen wurden iterativ ausgeführt, wobei eine Zeile gleichzeitig verarbeitet wurde. Sie hatten keine umfassende Kostenschätzung in einem Ausführungsplan, und sie haben keine Parallelität in einem Abfrageplan zugelassen. Beim Inlining von benutzerdefinierten Funktionen werden diese Funktionen in skalare Unterabfragen anstelle des Operators der benutzerdefinierten Funktion im Ausführungsplan transformiert. Diese Transformation kann zu erheblichen Leistungssteigerungen bei Abfragen führen, die skalare Funktionsaufrufe einschließen.

Approximate Count Distinct

Ein gängiges Data-Warehouse-Abfragemuster besteht darin, eine eindeutige Anzahl von Bestellungen oder Benutzern auszuführen. Dieses Abfragemuster kann für eine große Tabelle aufwändig sein. Approximate Count Distinct ermöglicht einen viel schnelleren Ansatz, um eine klare Anzahl durch Gruppierung von Zeilen zu erhalten. Diese Funktion garantiert eine Fehlerrate von 2 % mit einem Vertrauensintervall von 97 %.