Intelligente Abfrageverarbeitung in SQL-DatenbankenIntelligent query processing in SQL databases

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

Die Featurefamilie „Intelligente Abfrageverarbeitung“ (Intelligent Query Processing, IQP) umfasst Features mit weitreichenden Auswirkungen, die die Leistung vorhandener Workloads mit minimalem Implementierungsaufwand verbessern.The intelligent query processing (IQP) feature family includes features with broad impact that improve the performance of existing workloads with minimal implementation effort to adopt.

Intelligente Abfrageverarbeitung

In diesem 6-minütigen Video erhalten Sie einen Überblick über die intelligente Abfrageverarbeitung:Watch this 6-minute video for an overview of intelligent query processing:

Sie können Workloads automatisch für die intelligente Abfrageverarbeitung anpassen, indem Sie den geeigneten Datenbank-Kompatibilitätsgrad für die Datenbank aktivieren.You can make workloads automatically eligible for intelligent query processing by enabling the applicable database compatibility level for the database. Diesen können Sie mit Transact-SQLTransact-SQL festlegen.You can set this using Transact-SQLTransact-SQL. Beispiel:For example:

ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150;

In der folgenden Tabelle sind Details zu allen Features der intelligenten Abfrageverarbeitung dargestellt, sowie deren jeweiligen Anforderungen für den Datenbank-Kompatibilitätsgrad.The following table details all intelligent query processing features, along with any requirement they have for database compatibility level.

IQP-FeatureIQP Feature Unterstützt in Azure SQL-DatenbankSupported in Azure SQL Database Unterstützt in SQL ServerSupported in SQL Server BeschreibungDescription
Adaptive Joins (Batchmodus)Adaptive Joins (Batch Mode) Ja, unter Kompatibilitätsgrad 140Yes, under compatibility level 140 Ja, ab SQL Server 2017 (14.x)SQL Server 2017 (14.x) unter Kompatibilitätsgrad 140Yes, starting in SQL Server 2017 (14.x)SQL Server 2017 (14.x) under compatibility level 140 Adaptive Joins wählen je nach tatsächlichen Eingabezeilen während der Laufzeit dynamisch einen Jointyp aus.Adaptive joins dynamically select a join type during runtime based on actual input rows.
Approximate Count DistinctApproximate Count Distinct JaYes Ja, ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)Yes, starting in SQL Server 2019 (15.x)SQL Server 2019 (15.x) Stellt die geschätzte Abfrageverarbeitung für Big Data-Szenarios mit dem Vorteil einer hohen Leistung und einem niedrigen Speicherbedarf bereit.Provide approximate COUNT DISTINCT for big data scenarios with the benefit of high performance and a low memory footprint.
Batchmodus bei RowstoreBatch Mode on Rowstore Ja, unter Kompatibilitätsgrad 150Yes, under compatibility level 150 Ja, ab SQL Server 2019 (15.x)SQL Server 2019 (15.x) unter Kompatibilitätsgrad 150Yes, starting in SQL Server 2019 (15.x)SQL Server 2019 (15.x) under compatibility level 150 Stellt den Batchmodus für CPU-gebundene relationale Data Warehouse-Workloads bereit, ohne Columnstore-Indizes zu benötigen.Provide batch mode for CPU-bound relational DW workloads without requiring columnstore indexes.
Verschachtelte AusführungInterleaved Execution Ja, unter Kompatibilitätsgrad 140Yes, under compatibility level 140 Ja, ab SQL Server 2017 (14.x)SQL Server 2017 (14.x) unter Kompatibilitätsgrad 140Yes, starting in SQL Server 2017 (14.x)SQL Server 2017 (14.x) under compatibility level 140 Verwendet die tatsächliche Kardinalität der Tabellenwertfunktion mit mehreren Anweisungen, die bei der ersten Kompilierung aufgetreten ist, anstatt einer festgelegten Schätzung.Use the actual cardinality of the multi-statement table valued function encountered on first compilation instead of a fixed guess.
Feedback zur Speicherzuweisung (Batchmodus)Memory Grant Feedback (Batch Mode) Ja, unter Kompatibilitätsgrad 140Yes, under compatibility level 140 Ja, ab SQL Server 2017 (14.x)SQL Server 2017 (14.x) unter Kompatibilitätsgrad 140Yes, starting in SQL Server 2017 (14.x)SQL Server 2017 (14.x) under compatibility level 140 Wenn es für eine Abfrage im Batchmodus Operationen gibt, die sich auf den Datenträger auswirken, wird für anschließende Ausführungen mehr Speicher hinzugefügt.If a batch mode query has operations that spill to disk, add more memory for consecutive executions. Wenn eine Abfrage unnötigerweise mehr als die Hälfte des zugewiesenen Speichers belegt, wird die Speicherzuweisungsseite für anschließende Ausführungen reduziert.If a query wastes > 50% of the memory allocated to it, reduce the memory grant side for consecutive executions.
Feedback zur Speicherzuweisung (Zeilenmodus)Memory Grant Feedback (Row Mode) Ja, unter Kompatibilitätsgrad 150Yes, under compatibility level 150 Ja, ab SQL Server 2019 (15.x)SQL Server 2019 (15.x) unter Kompatibilitätsgrad 150Yes, starting in SQL Server 2019 (15.x)SQL Server 2019 (15.x) under compatibility level 150 Wenn es für eine Abfrage im Zeilenmodus Operationen gibt, die sich auf den Datenträger auswirken, wird für anschließende Ausführungen mehr Speicher hinzugefügt.If a row mode query has operations that spill to disk, add more memory for consecutive executions. Wenn eine Abfrage unnötigerweise mehr als die Hälfte des zugewiesenen Speichers belegt, wird die Speicherzuweisungsseite für anschließende Ausführungen reduziert.If a query wastes > 50% of the memory allocated to it, reduce the memory grant side for consecutive executions.
Inlining benutzerdefinierter SkalarfunktionenScalar UDF Inlining NeinNo Ja, ab SQL Server 2019 (15.x)SQL Server 2019 (15.x) unter Kompatibilitätsgrad 150Yes, starting in SQL Server 2019 (15.x)SQL Server 2019 (15.x) under compatibility level 150 Benutzerdefinierte Skalarfunktionen werden in äquivalente relationale Ausdrücke transformiert, für die „Inlining“ in die aufrufende Abfrage ausgeführt wird, was häufig zu erheblichen Leistungssteigerungen führt.Scalar UDFs are transformed into equivalent relational expressions that are "inlined" into the calling query, often resulting in significant performance gains.
Verzögerte Kompilierung von TabellenvariablenTable Variable Deferred Compilation Ja, unter Kompatibilitätsgrad 150Yes, under compatibility level 150 Ja, ab SQL Server 2019 (15.x)SQL Server 2019 (15.x) unter Kompatibilitätsgrad 150Yes, starting in SQL Server 2019 (15.x)SQL Server 2019 (15.x) under compatibility level 150 Verwendet die tatsächliche Kardinalität der Tabellenvariable, die bei der ersten Kompilierung aufgetreten ist, anstatt einer festgelegten Schätzung.Use the actual cardinality of the table variable encountered on first compilation instead of a fixed guess.

Adaptive Joins im BatchmodusBatch mode Adaptive joins

Mit dem Feature „Adaptive Joins im Batchmodus“ wird es ermöglicht, die Wahl der Join-Methode (Hashjoin oder Join geschachtelter Schleifen) auf den Zeitpunkt nach der Überprüfung der ersten Eingabe zu verzögern, indem ein einzelner zwischengespeicherter Plan verwendet wird.The batch mode Adaptive Joins feature enables the choice of a Hash Join or Nested Loops Join method to be deferred until after the first input has been scanned, by using a single cached plan. Der Operator für adaptive Joins definiert einen Schwellenwert, der bestimmt, wann zu einem Plan geschachtelter Schleifen gewechselt wird.The Adaptive Join operator defines a threshold that is used to decide when to switch to a Nested Loops plan. Daher kann Ihr Plan während der Ausführung dynamisch zu einer passenderen Joinstrategie wechseln.Your plan can therefore dynamically switch to a better join strategy during execution.

Weitere Informationen, z. B. zum Deaktivieren adaptiver Joins ohne Änderung des Kompatibilitätsgrads, finden Sie unter Grundlegendes zu adaptiven Joins.For more information, including how to disable Adaptive joins without changing the compatibility level, see Understanding Adaptive joins.

Feedback zur Speicherzuweisung im BatchmodusBatch mode memory grant feedback

Der Plan nach der Ausführung einer Abfrage in SQL ServerSQL Server enthält den für die Ausführung mindestens erforderlichen Speicherplatz und die ideale Speicherzuweisungsgröße, sodass alle Zeilen in den Speicher passen.A query's post-execution plan in SQL ServerSQL Server includes the minimum required memory needed for execution and the ideal memory grant size to have all rows fit in memory. Es gibt Leistungseinbußen, wenn die Speicherzuweisungsgrößen falsch sind.Performance suffers when memory grant sizes are incorrectly sized. Zu große Zuweisungen führen zu verschwendetem Speicherplatz und geringerer Parallelität.Excessive grants result in wasted memory and reduced concurrency. Nicht ausreichende Speicherzuweisungen führen zu teuren Überläufen auf den Datenträger.Insufficient memory grants cause expensive spills to disk. Für wiederholte Workloads berechnet das Feedback zur Speicherzuweisung im Batchmodus den tatsächlich erforderlichen Speicherplatz für eine Abfrage neu und aktualisiert anschließend den Zuweisungswert des zwischengespeicherten Plans.By addressing repeating workloads, batch mode memory grant feedback recalculates the actual memory required for a query and then updates the grant value for the cached plan. Wenn eine identische Abfrageanweisung ausgeführt wird, verwendet die Abfrage die angepasste Speicherzuweisungsgröße. Dadurch werden zu hohe Speicherzuweisungen verringert, die die Parallelität beeinträchtigen, und Probleme bei zu gering geschätzten Speicherzuweisungen behoben, die teuren Überläufe auf den Datenträger verursachen.When an identical query statement is executed, the query uses the revised memory grant size, reducing excessive memory grants that impact concurrency and fixing underestimated memory grants that cause expensive spills to disk. Der folgende Graph veranschaulicht ein Beispiel für den Gebrauch des Feedbacks zur adaptiven Speicherzuweisung im Batchmodus.The following graph shows one example of using batch mode adaptive memory grant feedback. Die erste Ausführung der Abfrage hat aufgrund von einer hoher Zahl von Überlaufen 88 Sekunden in Anspruch genommen:For the first execution of the query, duration was 88 seconds due to high spills:

DECLARE @EndTime datetime = '2016-09-22 00:00:00.000';
DECLARE @StartTime datetime = '2016-09-15 00:00:00.000';
SELECT TOP 10 hash_unique_bigint_id
FROM dbo.TelemetryDS
WHERE Timestamp BETWEEN @StartTime and @EndTime
GROUP BY hash_unique_bigint_id
ORDER BY MAX(max_elapsed_time_microsec) DESC;

Hohe Zahl von Überläufen

Wenn das Feedback zur Speicherzuweisung aktiviert ist, dauert die zweite Ausführung 1 Sekunde (vorher 88 Sekunden), Überläufe treten nicht mehr auf, und die Zuweisung ist höher:With memory grant feedback enabled, for the second execution, duration is 1 second (down from 88 seconds), spills are removed entirely, and the grant is higher:

Keine Überläufe

Größenanpassung des Feedbacks zur Speicherzuweisung im BatchmodusMemory grant feedback sizing

Wenn bei einer Bedingung mit einer zu großen Speicherzuweisung der zugewiesene Speicher mehr als doppelt so groß ist als der tatsächlich verwendete Speicher, berechnet das Feedback zur Speicherzuweisung diese neu und aktualisiert den zwischengespeicherten Plan.For an excessive memory grant condition, if the granted memory is more than two times the size of the actual used memory, memory grant feedback will recalculate the memory grant and update the cached plan. Pläne mit Speicherzuweisungen unter 1 MB werden bei Überschreitungen nicht neu berechnet.Plans with memory grants under 1 MB will not be recalculated for overages. Bei einer Bedingung mit zu geringen Speicherzuweisungen, die bei Batchmodusoperatoren zu einem Überlauf auf einen Datenträger führen, löst das Feedback zur Speicherzuweisung eine Neuberechnung der Speicherzuweisung aus.For an insufficiently sized memory grant condition, that result in a spill to disk for batch mode operators, memory grant feedback will trigger a recalculation of the memory grant. Überlaufereignisse werden an das Feedback zur Speicherzuweisung gemeldet und können als XEvent-Ereignis spilling_report_to_memory_grant_feedback angegeben werden.Spill events are reported to memory grant feedback and can be surfaced via the spilling_report_to_memory_grant_feedback xEvent. Dieses Ereignis gibt die Knoten-ID aus dem Plan und der Größe der übergelaufenen Daten dieses Knotens zurück.This event returns the node ID from the plan and spilled data size of that node.

Feedback zur Speicherzuweisung und parameterempfindliche SzenariosMemory grant feedback and parameter sensitive scenarios

Verschiedene Parameterwerte können auch unterschiedliche Abfragepläne erfordern, um optimale Ergebnisse zu bieten.Different parameter values may also require different query plans in order to remain optimal. Diese Art von Abfrage wird als „parameterempfindlich“ bezeichnet.This type of query is defined as "parameter-sensitive." Bei parameterempfindlichen Plänen deaktiviert sich das Feedback zur Speicherzuweisung in Abfragen selbst, wenn es nicht stabile Speicheranforderungen aufweist.For parameter-sensitive plans, memory grant feedback will disable itself on a query if it has unstable memory requirements. Der Plan wird nach mehreren wiederholten Abfrageausführungen deaktiviert. Dies können Sie beobachten, indem Sie das XEvent memory_grant_feedback_loop_disabled überwachen.The plan is disabled after several repeated runs of the query and this can be observed by monitoring the memory_grant_feedback_loop_disabled xEvent. Weitere Informationen zur Parameterermittlung und -empfindlichkeit finden Sie im Leitfaden zur Architektur der Abfrageverarbeitung.For more information about parameter sniffing and parameter sensitivity, refer to the Query Processing Architecture Guide.

Caching des Feedbacks zur SpeicherzuweisungMemory grant feedback caching

Das Feedback kann für eine einzelne Ausführung in einem zwischengespeicherten Plan gespeichert werden.Feedback can be stored in the cached plan for a single execution. Allerdings sind es aufeinanderfolgende Ausführungen dieser Anweisung, die von Anpassungen des Feedbacks zur Speicherzuweisung profitieren.It is the consecutive executions of that statement, however, that benefit from the memory grant feedback adjustments. Diese Funktion wird bei wiederholten Ausführungen von Anweisungen angewendet.This feature applies to repeated execution of statements. Das Feedback zur Speicherzuweisung ändert nur den zwischengespeicherten Plan.Memory grant feedback will change only the cached plan. Änderungen werden aktuell nicht im Abfragespeicher erfasst.Changes are currently not captured in the Query Store. Das Feedback wird nicht übernommen, wenn der Plan aus dem Cache entfernt wird.Feedback is not persisted if the plan is evicted from cache. Das Feedback geht ebenso verloren, wenn es zu einem Failover kommt.Feedback will also be lost if there is a failover. Eine Anweisung mit OPTION (RECOMPILE) erstellt einen neuen Plan und speichert diesen nicht zwischen.A statement using OPTION (RECOMPILE) creates a new plan and does not cache it. Da er nicht zwischengespeichert wird, wird auch kein Feedback zur Speicherzuweisung erzeugt und für diese Kompilierung und Ausführung auch nicht gespeichert.Since it is not cached, no memory grant feedback is produced and it is not stored for that compilation and execution. Wenn allerdings eine äquivalente Anweisung (d.h. eine Anweisung mit dem gleichen Abfragehash), die nichtOPTION (RECOMPILE) verwendet hat, zwischengespeichert und dann erneut ausgeführt wird, kann die darauffolgende Anweisung vom Feedback zur Speicherzuweisung profitieren.However, if an equivalent statement (that is, with the same query hash) that did not use OPTION (RECOMPILE) was cached and then re-executed, the consecutive statement can benefit from memory grant feedback.

Nachverfolgen der Aktivität des Feedbacks zur SpeicherzuweisungTracking memory grant feedback activity

Sie können Ereignisse des Feedbacks zur Speicherzuweisung mit dem XEvent-Ereignis memory_grant_updated_by_feedback nachverfolgen.You can track memory grant feedback events using the memory_grant_updated_by_feedback xEvent. Dieses Ereignis verfolgt den Verlauf der Ausführungsanzahl, die Zahl von Aktualisierungen des Plans durch das Feedback zur Speicherzuweisung und die optimale zusätzliche Speicherzuweisung vor der Anpassung und nach der Anpassung des zwischengespeicherten Plans durch das Feedback zur Speicherzuweisung.This event tracks the current execution count history, the number of times the plan has been updated by memory grant feedback, the ideal additional memory grant before modification and the ideal additional memory grant after memory grant feedback has modified the cached plan.

Feedback zur Speicherzuweisung, Ressourcenkontrolle und AbfragehinweiseMemory grant feedback, resource governor and query hints

Der tatsächlich zugewiesene Speicher berücksichtigt die Abfragespeichereinschränkung, die von der Ressourcenkontrolle oder dem Abfragehinweis bestimmt wird.The actual memory granted honors the query memory limit determined by the resource governor or query hint.

Deaktivieren des Feedbacks zur Speicherzuweisung im Batchmodus ohne Änderung des KompatibilitätsgradsDisabling batch mode memory grant feedback without changing the compatibility level

Das Feedback zur Speicherzuweisung kann im Datenbank- oder Anweisungsbereich deaktiviert werden, während der Datenbankkompatibilitätsgrad weiterhin bei 140 und höher bleibt.Memory grant feedback can be disabled at the database or statement scope while still maintaining database compatibility level 140 and higher. Um das Feedback zur Speicherzuweisung im Batchmodus für alle Abfrageausführungen, die aus der Datenbank stammen, zu deaktivieren, führen Sie die folgende Anweisung im Kontext der betroffenen Datenbank aus:To disable batch mode memory grant feedback for all query executions originating from the database, execute the following within the context of the applicable database:

-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK = ON;

-- Starting with SQL Server 2019, and in Azure SQL Database
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = OFF;

Ist diese Einstellung aktiviert, wird sie in sys.database_scoped_configurations als aktiviert aufgeführt.When enabled, this setting will appear as enabled in sys.database_scoped_configurations.

Um das Feedback zur Speicherzuweisung im Batchmodus für alle Abfrageausführungen, die aus der Datenbank stammen, wieder zu aktivieren, führen Sie die folgende Anweisung im Kontext der betroffenen Datenbank aus:To re-enable batch mode memory grant feedback for all query executions originating from the database, execute the following within the context of the applicable database:

-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK = OFF;

-- Azure SQL Database, SQL Server 2019 and higher
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_MEMORY_GRANT_FEEDBACK = ON;

Sie können das Feedback zur Speicherzuweisung im Batchmodus auch für eine bestimmte Abfrage deaktivieren, indem Sie DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK als USE HINT-Abfragehinweis festlegen.You can also disable batch mode memory grant feedback for a specific query by designating DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK as a USE HINT query hint. Beispiel:For example:

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT ('DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK')); 

Ein USE HINT-Abfragehinweis hat Vorrang vor einer datenbankweit gültigen Konfiguration oder einer Ablaufverfolgungsflageinstellung.A USE HINT query hint takes precedence over a database scoped configuration or trace flag setting.

Feedback zur Speicherzuweisung im ZeilenmodusRow mode memory grant feedback

Anwendungsbereich: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL Database

Das Feedback zur Speicherzuweisung im Zeilenmodus erweitert die Feedbackfunktion zur Speicherzuweisung im Batchmodus, indem die Größe der Speicherzuweisung sowohl für Batch- als auch für Zeilenmodusoperatoren angepasst wird.Row mode memory grant feedback expands on the batch mode memory grant feedback feature by adjusting memory grant sizes for both batch and row mode operators.

Um Feedback zur Speicherzuweisung im Zeilenmodus in Azure SQL-DatenbankAzure SQL Database zu aktivieren, aktivieren Sie den Datenbank-Kompatibilitätsgrad 150 für die Datenbank, mit der Sie beim Ausführen der Abfrage verbunden sind.To enable row mode memory grant feedback in Azure SQL-DatenbankAzure SQL Database, enable database compatibility level 150 for the database you are connected to when executing the query.

Die Feedbackaktivität zur Speicherzuweisung im Zeilenmodus wird über das XEvent-Ereignis memory_grant_updated_by_feedback angezeigt.Row mode memory grant feedback activity will be visible via the memory_grant_updated_by_feedback XEvent.

Seitdem das Feedback zur Speicherzuweisung im Zeilenmodus verfügbar ist, werden zwei neue Abfrageplanattribute für die tatsächlichen Pläne nach der Ausführung angezeigt: IsMemoryGrantFeedbackAdjusted und LastRequestedMemory. Diese werden dem XML-Element des MemoryGrantInfo-Abfrageplans hinzugefügt.Starting with row mode memory grant feedback, two new query plan attributes will be shown for actual post-execution plans: IsMemoryGrantFeedbackAdjusted and LastRequestedMemory, which are added to the MemoryGrantInfo query plan XML element.

LastRequestedMemory zeigt den zugewiesenen Speicher in KB von der vorherigen Abfrageausführung an.LastRequestedMemory shows the granted memory in Kilobytes (KB) from the prior query execution. Mit dem Attribut IsMemoryGrantFeedbackAdjusted können Sie den Feedbackstatus einer Speicherzuweisung für die Anweisung in einem Abfrageausführungsplan überprüfen.IsMemoryGrantFeedbackAdjusted attribute allows you to check the state of memory grant feedback for the statement within an actual query execution plan. Folgende Werte werden in diesem Attribut angezeigt:Values surfaced in this attribute are as follows:

Wert IsMemoryGrantFeedbackAdjustedIsMemoryGrantFeedbackAdjusted Value BESCHREIBUNGDescription
No: First ExecutionNo: First Execution Das Feedback zur Speicherzuweisung passt den Speicher für die erste Kompilierung und die zugeordnete Ausführung nicht an.Memory grant feedback does not adjust memory for the first compile and associated execution.
No: Accurate GrantNo: Accurate Grant Wenn es keinen Überlauf auf dem Datenträger gibt und die Anweisung mindestens 50 % des zugewiesenen Speichers nutzt, wird Feedback zur Speicherzuweisung nicht ausgelöst.If there is no spill to disk and the statement uses at least 50% of the granted memory, then memory grant feedback is not triggered.
No: Feedback disabledNo: Feedback disabled Wenn das Feedback zur Speicherzuweisung kontinuierlich ausgelöst wird und zwischen Speichererhöhung und -verkleinerung schwankt, deaktivieren Sie das Feedback zur Speicherzuweisung für die Anweisung.If memory grant feedback is continually triggered and fluctuates between memory-increase and memory-decrease operations, we will disable memory grant feedback for the statement.
Yes: AdjustingYes: Adjusting Das Feedback zur Speicherzuweisung wurde angewendet und kann für die nächste Ausführung weiter angepasst werden.Memory grant feedback has been applied and may be further adjusted for the next execution.
Yes: StableYes: Stable Das Feedback zur Speicherzuweisung wurde angewendet und der zugewiesene Speicher ist jetzt stabil. Das bedeutet: Der für die vorherige Ausführung zuletzt zugewiesene Speicher entspricht dem für die aktuelle Ausführung.Memory grant feedback has been applied and granted memory is now stable, meaning that what was last granted for the previous execution is what was granted for the current execution.

Deaktivieren des Feedbacks zur Speicherzuweisung im Zeilenmodus ohne Änderung des KompatibilitätsgradsDisabling row mode memory grant feedback without changing the compatibility level

Das Feedback zur Speicherzuweisung im Zeilenmodus kann im Datenbank- oder Anweisungsbereich deaktiviert werden, während der Datenbankkompatibilitätsgrad weiterhin bei 150 und höher bleibt.Row mode memory grant feedback can be disabled at the database or statement scope while still maintaining database compatibility level 150 and higher. Um das Feedback zur Speicherzuweisung im Zeilenmodus für alle Abfrageausführungen, die aus der Datenbank stammen, zu deaktivieren, führen Sie die folgende Anweisung im Kontext der betroffenen Datenbank aus:To disable row mode memory grant feedback for all query executions originating from the database, execute the following within the context of the applicable database:

ALTER DATABASE SCOPED CONFIGURATION SET ROW_MODE_MEMORY_GRANT_FEEDBACK = OFF;

Um das Feedback zur Speicherzuweisung im Zeilenmodus für alle Abfrageausführungen, die aus der Datenbank stammen, erneut zu aktivieren, führen Sie die folgende Anweisung im Kontext der betroffenen Datenbank aus:To re-enable row mode memory grant feedback for all query executions originating from the database, execute the following within the context of the applicable database:

ALTER DATABASE SCOPED CONFIGURATION SET ROW_MODE_MEMORY_GRANT_FEEDBACK = ON;

Sie können das Feedback zur Speicherzuweisung im Zeilenmodus auch für eine bestimmte Abfrage deaktivieren, indem Sie DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK als USE HINT-Abfragehinweis festlegen.You can also disable row mode memory grant feedback for a specific query by designating DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK as a USE HINT query hint. Beispiel:For example:

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT ('DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK')); 

Ein USE HINT-Abfragehinweis hat Vorrang vor einer datenbankweit gültigen Konfiguration oder einer Ablaufverfolgungsflageinstellung.A USE HINT query hint takes precedence over a database scoped configuration or trace flag setting.

Verschachtelte Ausführung für MSTVFsInterleaved execution for MSTVFs

Bei der verschachtelten Ausführung verwenden Sie die tatsächliche Zeilenanzahl aus der Funktion, um besser informierte Entscheidungen zum Downstream-Abfrageplan zu treffen.With interleaved execution, the actual row counts from the function are used to make better-informed downstream query plan decisions. Weitere Informationen zu Tabellenwertfunktionen mit mehreren Anweisungen (MSTVFs) finden Sie unter Tabellenwertfunktionen.For more information on multi-statement table-valued functions (MSTVFs), see Table-valued functions.

Eine verschachtelte Ausführung ändert die unidirektionale Grenze zwischen der Optimierungs- und der Ausführungsphase für eine Ausführung mit einer Abfrage. Zudem können Pläne damit auf Grundlage der überarbeiteten Kardinalitätsschätzungen angepasst werden.Interleaved execution changes the unidirectional boundary between the optimization and execution phases for a single-query execution and enables plans to adapt based on the revised cardinality estimates. Wenn Sie bei der Optimierung auf einen möglichen Kandidaten für eine verschachtelte Ausführung (bei der es sich aktuell um Tabellenfunktionen mit mehreren Anweisungen (MSTVFs) handelt) stoßen, wird die Optimierung unterbrochen, die entsprechende Unterstruktur ausgeführt, die genauen Kardinalitätsschätzungen erfasst, und anschließend wird die Optimierung für Downstreamvorgänge wiederaufgenommen.During optimization if we encounter a candidate for interleaved execution, which is currently multi-statement table-valued functions (MSTVFs), we will pause optimization, execute the applicable subtree, capture accurate cardinality estimates, and then resume optimization for downstream operations.

Die festgelegte Kardinalitätsschätzung von Tabellenwertfunktionen mit mehreren Anweisungen beträgt ab SQL Server 2014 (12.x)SQL Server 2014 (12.x) „100“ und in früheren Versionen von SQL ServerSQL Server „1“.MSTVFs have a fixed cardinality guess of 100 starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x), and 1 for earlier SQL ServerSQL Server versions. Die verschachtelte Ausführung löst Probleme bei der Leistung von Workloads, die auf die festgelegten Kardinalitätsschätzungen von MSTVFs zurückzuführen sind.Interleaved execution helps workload performance issues that are due to these fixed cardinality estimates associated with MSTVFs. Weitere Informationen zu MSTVFs finden Sie unter Erstellen benutzerdefinierter Funktionen (Datenbank-Engine).For more information on MSTVFs, see Create User-defined Functions (Database Engine).

Die folgende Abbildung zeigt die Ausgabe einer Liveabfragestatistik, eine Teilmenge eines allgemeinen Ausführungsplans, der die Auswirkung festgelegter Kardinalitätsschätzungen von MSTVFs veranschaulicht.The following image depicts a Live Query Statistics output, a subset of an overall execution plan that shows the impact of fixed cardinality estimates from MSTVFs. Sie sehen den tatsächlichen Zeilenfluss gegenüber dem geschätzten.You can see the actual row flow vs. estimated rows. Es gibt drei erwähnenswerte Bereiche des Plans (von rechts nach links):There are three noteworthy areas of the plan (flow is from right to left):

  1. Der MSTVF-Table Scan hat eine festgelegte Schätzung von 100 Zeilen.The MSTVF Table Scan has a fixed estimate of 100 rows. In diesem Beispiel gibt es allerdings 527.597 Zeilen, die den MSTVF Table Scan durchlaufen. Dies ist an der Liveabfragestatistik 527597 von 100 der tatsächlichen Elemente von geschätzten Elemente zu erkennen – die festgelegte Schätzung liegt also deutlich zu weit unten.For this example, however, there are 527,597 rows flowing through this MSTVF Table Scan, as seen in Live Query Statistics via the 527597 of 100 actual of estimated - so the fixed estimate is significantly skewed.
  2. Für den Nested Loop-Vorgang wird davon ausgegangen, dass nur 100 Zeilen von der äußeren Seite des Joins zurückgegebene werden.For the Nested Loops operation, only 100 rows are assumed to be returned by the outer side of the join. Aufgrund der hohen Zahl an tatsächlich von MSTVF zurückgegebenen Zeilen sollten Sie sich aber für einen komplett anderen Joinalgorithmus entscheiden.Given the high number of rows actually being returned by the MSTVF, you are likely better off with a different join algorithm altogether.
  3. Beachten Sie, dass beim Hash Match-Vorgang ein kleines Warnsymbol angezeigt wird, das in diesem Fall darauf hinweist, dass es einen Überlauf auf den Datenträger hab.For the Hash Match operation, notice the small warning symbol, which in this case is indicating a spill to disk.

Zeilenfluss vs. geschätzte Zeilen

Vergleichen Sie den vorherigen Plan mit dem tatsächlich generierten Plan mit aktivierter verschachtelter Ausführung:Contrast the prior plan with the actual plan generated with interleaved execution enabled:

Verschachtelter Plan

  1. Beachten Sie, dass der MSTVF-Table Scan jetzt die genaue Kardinalitätsschätzung widerspiegelt.Notice that the MSTVF table scan now reflects an accurate cardinality estimate. Beachten Sie auch die Neuanordnung des Table Scans und der anderen Vorgänge.Also notice the re-ordering of this table scan and the other operations.
  2. Bei Joinalgorithmen haben Sie von einem Nested Loop-Vorgang zu einem Hash Match-Vorgang gewechselt, was für die vorhandene Zahl an Zeilen optimaler ist.And regarding join algorithms, we have switched from a Nested Loop operation to a Hash Match operation instead, which is more optimal given the large number of rows involved.
  3. Beachten Sie auch, dass es keine Überlaufwarnungen mehr gibt, da mehr Speicherplatz auf Grundlage der tatsächlichen Zeilenzahl, die den MSTVF-Table Scan durchläuft, zugewiesen wird.Also notice that we no longer have spill-warnings, as we're granting more memory based on the true row count flowing from the MSTVF table scan.

Zulässige Anweisungen für verschachtelte AusführungenInterleaved execution eligible statements

Verweisanweisungen von MSTVF in verschachtelten Ausführungen müssen aktuell schreibgeschützt sein und dürfen nicht Teil eines Datenmodifizierungsvorgangs sein.MSTVF referencing statements in interleaved execution must currently be read-only and not part of a data modification operation. MSTVFs eignen sich nur für die verschachtelte Ausführung, wenn Sie Laufzeitkonstanten verwenden.Also, MSTVFs are not eligible for interleaved execution if they do not use runtime constants.

Vorteile der verschachtelten AusführungInterleaved execution benefits

Allgemein gilt: Je höher der Unterschied zwischen der geschätzten und tatsächlichen Zeilenzahl in Verbindung mit der Zahl von Downstreamplanvorgängen ist, desto mehr wird die Leistung beeinträchtigt.In general, the higher the skew between the estimated vs. actual number of rows, coupled with the number of downstream plan operations, the greater the performance impact. Allgemein profitieren Abfragen von der verschachtelten Ausführung, die:In general, interleaved execution benefits queries where:

  1. eine große Diskrepanz zwischen der geschätzten und tatsächlichen Zeilenzahl für das temporäre Resultset aufweisen (in diesem Fall MSTVF);There is a large skew between the estimated vs. actual number of rows for the intermediate result set (in this case, the MSTVF).
  2. und in denen die Abfrage empfindlich ist, was Änderungen der Größe des temporären Ergebnisses angeht.And the overall query is sensitive to a change in the size of the intermediate result. Dies geschieht typischerweise, wenn es eine komplexe Struktur über der Unterstruktur im Abfrageplan gibt.This typically happens when there is a complex tree above that subtree in the query plan. Ein einfaches SELECT * einer MSTVF profitiert nicht von einer verschachtelten Ausführung.A simple SELECT * from an MSTVF will not benefit from interleaved execution.

Aufwand der verschachtelten AusführungInterleaved execution overhead

Der Aufwand sollte sehr gering oder nicht vorhanden sein.The overhead should be minimal-to-none. MSTVFs wurden bereits vor der Einführung der verschachtelten Ausführung materialisiert. Der Unterschied besteht jedoch darin, dass jetzt eine verzögerte Optimierung möglich ist sowie die anschließende Nutzung der Kardinalitätsschätzung des materialisierten Rowsets.MSTVFs were already being materialized prior to the introduction of interleaved execution, however the difference is that now we're now allowing deferred optimization and are then leveraging the cardinality estimate of the materialized row set. Genauso wie mit allen Änderungen, die sich auf Pläne auswirken, können sich einige Pläne so ändern, dass Sie einen schlechteren Plan für die Abfrage erhalten, auch wenn Sie eine bessere Kardinalität der Unterstruktur haben.As with any plan affecting changes, some plans could change such that with better cardinality for the subtree we get a worse plan for the query overall. Dies können Sie z.B. verhindern, indem Sie den Kompatibilitätsgrad wiederherstellen oder den Abfragespeicher verwenden, um das Verwenden der nicht rückläufigen Version des Plans zu erzwingen.Mitigation can include reverting the compatibility level or using Query Store to force the non-regressed version of the plan.

Verschachtelte Ausführung und nachfolgende AusführungenInterleaved execution and consecutive executions

Sobald ein verschachtelter Ausführungsplan zwischengespeichert wurde, wird der Plan mit den überarbeiteten Schätzungen der ersten Ausführung für nachfolgende Ausführungen verwendet, ohne dass die verschachtelte Ausführung neu instantiiert werden muss.Once an interleaved execution plan is cached, the plan with the revised estimates on the first execution is used for consecutive executions without re-instantiating interleaved execution.

Nachverfolgen der Aktivität von verschachtelten AusführungenTracking interleaved execution activity

Sie können sich Verwendungsattribute im Ausführungsplan der Abfrage anschauen:You can see usage attributes in the actual query execution plan:

AusführungsplanattributExecution Plan attribute BESCHREIBUNGDescription
ContainsInterleavedExecutionCandidatesContainsInterleavedExecutionCandidates Gilt für den Knoten QueryPlan.Applies to the QueryPlan node. Wenn dieser true lautet, gibt dieser an, dass der Plan mögliche Kandidaten für die überlappende Ausführung enthält.When true, means the plan contains interleaved execution candidates.
IsInterleavedExecutedIsInterleavedExecuted Das Attribut des Elements RuntimeInformation befindet sich für den Knoten „TVF“ unter „RelOp“.Attribute of the RuntimeInformation element under the RelOp for the TVF node. Wenn es true entspricht, wurde der Vorgang im Zuge einer überlappenden Ausführung materialisiert.When true, means the operation was materialized as part of an interleaved execution operation.

Sie können überlappende Ausführungen auch mit den folgenden XEvents nachverfolgen:You can also track interleaved execution occurrences via the following xEvents:

XEventxEvent BESCHREIBUNGDescription
interleaved_exec_statusinterleaved_exec_status Dieses Ereignis wird ausgelöst, wenn eine verschachtelte Ausführung durchgeführt wird.This event fires when interleaved execution is occurring.
interleaved_exec_stats_updateinterleaved_exec_stats_update Dieses Ereignis beschreibt die von der verschachtelten Ausführung aktualisierten Kardinalitätsschätzungen.This event describes the cardinality estimates updated by interleaved execution.
Interleaved_exec_disabled_reasonInterleaved_exec_disabled_reason Dieses Ereignis wird ausgelöst, wenn eine Abfrage mit einem möglichen Kandidaten für eine verschachtelte Ausführung nicht verschachtelt ausgeführt wird.This event fires when a query with a possible candidate for interleaved execution does not actually get interleaved execution.

Eine Abfrage muss ausgeführt werden, damit die verschachtelte Ausführung die Kardinalitätsschätzungen für MSTVF überarbeiten kann.A query must be executed in order to allow interleaved execution to revise MSTVF cardinality estimates. Allerdings zeigt der geschätzte Ausführungsplan immer noch an, wenn es Kandidaten für eine überlappende Ausführung gibt. Dies macht er mithilfe des showplan-Attributs ContainsInterleavedExecutionCandidates.However, the estimated execution plan still shows when there are interleaved execution candidates via the ContainsInterleavedExecutionCandidates showplan attribute.

Zwischenspeichern der verschachtelte AusführungInterleaved execution caching

Wenn ein Plan aus dem Cache gelöscht oder entfernt wird, kommt es bei der Abfrageausführung zu einer neuen Kompilierung mit der verschachtelten Ausführung.If a plan is cleared or evicted from cache, upon query execution there is a fresh compilation that uses interleaved execution. Eine Anweisung mit OPTION (RECOMPILE) erstellt einen neuen Plan mit der überlappenden Ausführung und speichert diesen nicht zwischen.A statement using OPTION (RECOMPILE) will create a new plan using interleaved execution and not cache it.

Geschachtelte Ausführung und Interoperabilität des AbfragespeichersInterleaved execution and query store interoperability

Pläne mit der verschachtelten Ausführung können erzwungen werden.Plans using interleaved execution can be forced. Der Plan ist die Version mit angepassten Kardinalitätsschätzungen auf Grundlage der ersten Ausführung.The plan is the version that has corrected cardinality estimates based on initial execution.

Deaktivieren von geschachtelte Ausführung ohne Änderung des KompatibilitätsgradsDisabling interleaved execution without changing the compatibility level

Geschachtelte Ausführung kann im Datenbank- oder Anweisungsbereich deaktiviert werden, während der Datenbankkompatibilitätsgrad weiterhin bei 140 und höher bleibt.Interleaved execution can be disabled at the database or statement scope while still maintaining database compatibility level 140 and higher. Um geschachtelte Ausführung für alle Abfrageausführungen zu deaktivieren, die aus der Datenbank stammen, führen Sie die folgende Anweisung im Kontext der betroffenen Datenbank aus:To disable interleaved execution for all query executions originating from the database, execute the following within the context of the applicable database:

-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_INTERLEAVED_EXECUTION_TVF = ON;

-- Starting with SQL Server 2019, and in Azure SQL Database
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = OFF;

Ist diese Einstellung aktiviert, wird sie in sys.database_scoped_configurations als aktiviert aufgeführt.When enabled, this setting will appear as enabled in sys.database_scoped_configurations. Um geschachtelte Ausführung für alle Abfrageausführungen wieder zu aktivieren, die aus der Datenbank stammen, führen Sie die folgende Anweisung im Kontext der betroffenen Datenbank aus:To re-enable interleaved execution for all query executions originating from the database, execute the following within the context of the applicable database:

-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_INTERLEAVED_EXECUTION_TVF = OFF;

-- Starting with SQL Server 2019, and in Azure SQL Database
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = ON;

Sie können adaptive Joins auch für eine verschachtelte Ausführung für eine bestimmte Abfrage deaktivieren, indem Sie DISABLE_INTERLEAVED_EXECUTION_TVF als USE HINT-Abfragehinweis festlegen.You can also disable interleaved execution for a specific query by designating DISABLE_INTERLEAVED_EXECUTION_TVF as a USE HINT query hint. Beispiel:For example:

SELECT [fo].[Order Key], [fo].[Quantity], [foo].[OutlierEventQuantity]
FROM [Fact].[Order] AS [fo]
INNER JOIN [Fact].[WhatIfOutlierEventQuantity]('Mild Recession',
                            '1-01-2013',
                            '10-15-2014') AS [foo] ON [fo].[Order Key] = [foo].[Order Key]
                            AND [fo].[City Key] = [foo].[City Key]
                            AND [fo].[Customer Key] = [foo].[Customer Key]
                            AND [fo].[Stock Item Key] = [foo].[Stock Item Key]
                            AND [fo].[Order Date Key] = [foo].[Order Date Key]
                            AND [fo].[Picked Date Key] = [foo].[Picked Date Key]
                            AND [fo].[Salesperson Key] = [foo].[Salesperson Key]
                            AND [fo].[Picker Key] = [foo].[Picker Key]
OPTION (USE HINT('DISABLE_INTERLEAVED_EXECUTION_TVF'));

Ein USE HINT-Abfragehinweis hat Vorrang vor einer datenbankweit gültigen Konfiguration oder einer Ablaufverfolgungsflageinstellung.A USE HINT query hint takes precedence over a database scoped configuration or trace flag setting.

Verzögerte Kompilierung von TabellenvariablenTable variable deferred compilation

Anwendungsbereich: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL Database

Die verzögerte Kompilierung von Tabellenvariablen verbessert die Qualität des Abfrageplans und die Gesamtleistung für Abfragen mit Verweisen auf Tabellenvariablen.Table variable deferred compilation improves plan quality and overall performance for queries referencing table variables. Während der Optimierung und der ersten Kompilierung des Plans verteilt diese Funktion Kardinalitätsschätzungen, die auf tatsächlichen Tabellenvariablen-Zeilenzahlen basieren.During optimization and initial plan compilation, this feature will propagate cardinality estimates that are based on actual table variable row counts. Diese Informationen zur genauen Zeilenzahl werden dann zur Optimierung der nachgelagerten Planvorgänge verwendet.This exact row count information will then be used for optimizing downstream plan operations.

Bei der verzögerten Kompilierung von Tabellenvariablen wird die Kompilierung einer Anweisung, die auf eine Tabellenvariable verweist, bis zur ersten tatsächlichen Ausführung der Anweisung verzögert.With table variable deferred compilation, compilation of a statement that references a table variable is deferred until the first actual execution of the statement. Dieses Verhalten der verzögerten Kompilierung ist identisch mit dem von temporären Tabellen.This deferred compilation behavior is identical to the behavior of temporary tables. Diese Änderung führt dazu, dass anstelle des ursprünglichen einreihigen Schätzwertes die tatsächliche Kardinalität verwendet wird.This change results in the use of actual cardinality instead of the original one-row guess.

Aktivieren Sie den Datenbank-Kompatibilitätsgrad 150 für die Datenbank, mit der Sie beim Ausführen der Abfrage verbunden sind, um die verzögerten Kompilierung von Tabellenvariablen zu aktivieren.To enable table variable deferred compilation, enable database compatibility level 150 for the database you're connected to when the query runs.

Die verzögerte Kompilierung von Tabellenvariablen führt nicht zu Änderungen an anderen Merkmalen von Tabellenvariablen.Table variable deferred compilation doesn't change any other characteristics of table variables. Beispielsweise wird durch dieses Feature keine Spaltenstatistik zu Tabellenvariablen hinzugefügt.For example, this feature doesn't add column statistics to table variables.

Die verzögerte Kompilierung von Tabellenvariablen führt nicht zu einer häufigeren Neukompilierung.Table variable deferred compilation doesn't increase recompilation frequency. Stattdessen wird der Zeitpunkt der ersten Kompilierung verschoben.Rather, it shifts where the initial compilation occurs. Der resultierende zwischengespeicherte Plan wird basierend auf der anfänglichen Zeilenanzahl für die verzögerte Kompilierung von Tabellenvariablen generiert.The resulting cached plan generates based on the initial deferred compilation table variable row count. Der zwischengespeicherte Plan wird von nachfolgenden Abfragen wiederverwendet.The cached plan is reused by consecutive queries. Es wird solange wiederverwendet, bis der Plan entfernt oder erneut kompiliert wird.It's reused until the plan is evicted or recompiled.

Die Zeilenanzahl für Tabellenvariablen, die für die anfängliche Plankompilierung verwendet wird, stellt einen typischen Wert dar, der von einem geschätzten Festwert für die Zeilenanzahl abweichen kann.Table variable row count that is used for initial plan compilation represents a typical value might be different from a fixed row count guess. Bei Abweichungen profitieren Downstreamvorgänge.If it's different, downstream operations will benefit. Weicht die Zeilenanzahl für Tabellenvariablen für alle durchgeführten Ausführungen erheblich ab, wird die Leistung durch dieses Feature möglicherweise nicht verbessert.Performance may not be improved by this feature if the table variable row count varies significantly across executions.

Deaktivieren der verzögerten Kompilierung von Tabellenvariablen ohne Änderung des KompatibilitätsgradsDisabling table variable deferred compilation without changing the compatibility level

Deaktivieren Sie die verzögerte Kompilierung von Tabellenvariablen im Datenbank- oder Anweisungsbereich, während Sie den Datenbankkompatibilitätsgrad bei 150 und höher beibehalten.Disable table variable deferred compilation at the database or statement scope while still maintaining database compatibility level 150 and higher. Um die verzögerte Kompilierung von Tabellenvariablen für alle Abfrageausführungen zu deaktivieren, die aus der Datenbank stammen, führen Sie das folgende Beispiel im Kontext der betroffenen Datenbank aus:To disable table variable deferred compilation for all query executions originating from the database, execute the following example within the context of the applicable database:

ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = OFF;

Um die verzögerte Kompilierung von Tabellenvariablen für alle Abfrageausführungen, die aus der Datenbank stammen, erneut zu aktivieren, führen Sie das folgende Beispiel im Kontext der betroffenen Datenbank aus:To re-enable table variable deferred compilation for all query executions originating from the database, execute the following example within the context of the applicable database:

ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = ON;

Sie können die verzögerte Kompilierung von Tabellenvariablen auch für eine bestimmte Abfrage deaktivieren, indem Sie DISABLE_DEFERRED_COMPILATION_TV als USE HINT-Abfragehinweis zuweisen.You can also disable table variable deferred compilation for a specific query by assigning DISABLE_DEFERRED_COMPILATION_TV as a USE HINT query hint. Beispiel:For example:

DECLARE @LINEITEMS TABLE 
    (L_OrderKey INT NOT NULL,
     L_Quantity INT NOT NULL
    );

INSERT @LINEITEMS
SELECT L_OrderKey, L_Quantity
FROM dbo.lineitem
WHERE L_Quantity = 5;

SELECT  O_OrderKey,
    O_CustKey,
    O_OrderStatus,
    L_QUANTITY
FROM    
    ORDERS,
    @LINEITEMS
WHERE   O_ORDERKEY  =   L_ORDERKEY
    AND O_OrderStatus = 'O'
OPTION (USE HINT('DISABLE_DEFERRED_COMPILATION_TV'));

Inlining benutzerdefinierter SkalarfunktionenScalar UDF inlining

Anwendungsbereich: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x))Applies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x))

Das skalare UDF-Inlining wandelt skalare UDFs automatisch in relationale Ausdrücke um.Scalar UDF inlining automatically transforms scalar UDFs into relational expressions. Diese werden in die aufrufende SQL-Abfrage eingebettet.It embeds them in the calling SQL query. Diese Transformation verbessert die Leistung von Workloads, die skalare UDFs nutzen.This transformation improves the performance of workloads that take advantage of scalar UDFs. Skalares UDF-Inlining ermöglicht eine kostenbasierte Optimierung der Vorgänge innerhalb von UDFs.Scalar UDF inlining facilitates cost-based optimization of operations inside UDFs. Die Ergebnisse sind effiziente, mengenorientierte und parallele statt ineffiziente, iterative, serielle Ausführungspläne.The results are efficient, set-oriented, and parallel instead of inefficient, iterative, serial execution plans. Dieses Feature ist standardmäßig unter dem Datenbank-Kompatibilitätsgrad 150 aktiviert.This feature is enabled by default under database compatibility level 150.

Weitere Informationen finden Sie unter Inlining benutzerdefinierter Skalarfunktionen.For more information, see Scalar UDF inlining.

Geschätzte AbfrageverarbeitungApproximate query processing

Anwendungsbereich: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL Database

Die geschätzte Abfrageverarbeitung ist eine neue Featurefamilie.Approximate query processing is a new feature family. Sie stellt Aggregationen über große Datasets hinweg bereit, bei denen die Reaktionsfähigkeit wichtiger ist als die absolute Präzision.It aggregates across large datasets where responsiveness is more critical than absolute precision. Ein Beispiel ist die Berechnung eines COUNT(DISTINCT()) über 10 Milliarden Zeilen für die Anzeige auf einem Dashboard.An example is calculating a COUNT(DISTINCT()) across 10 billion rows, for display on a dashboard. In diesem Fall ist absolute Genauigkeit nicht wichtig, aber die Reaktionsfähigkeit ist es jedoch.In this case, absolute precision isn't important, but responsiveness is critical. Diese neue APPROX_COUNT_DISTINCT-Aggregatfunktion gibt die ungefähre Anzahl von eindeutigen Ungleich-Null-Werten in einer Gruppe zurück.The new APPROX_COUNT_DISTINCT aggregate function returns the approximate number of unique non-null values in a group.

Weitere Informationen finden Sie unter APPROX_COUNT_DISTINCT (Transact-SQL).For more information, see APPROX_COUNT_DISTINCT (Transact-SQL).

Batchmodus bei RowstoreBatch mode on rowstore

Anwendungsbereich: SQL ServerSQL Server (ab SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)), Azure SQL-DatenbankAzure SQL Database

Batchmodus bei Rowstore ermöglicht die Ausführung im Batchmodus für Analyseworkloads, die keine Columnstore-Indizes erfordern.Batch mode on rowstore enables batch mode execution for analytic workloads without requiring columnstore indexes. Dieses Feature unterstützt die Ausführung im Batchmodus und Bitmapfilter für On-Disk-Heaps und B-Struktur-Indizes.This feature supports batch mode execution and bitmap filters for on-disk heaps and B-tree indexes. Batchmodus bei Rowstore ermöglicht die Unterstützung aller vorhandenen batchmodusfähigen Operatoren.Batch mode on rowstore enables support for all existing batch mode-enabled operators.

HintergrundBackground

Mit SQL Server 2012 (11.x)SQL Server 2012 (11.x) wurde ein neues Feature zur Beschleunigung analytischer Workloads eingeführt: Columnstore-Indizes.SQL Server 2012 (11.x)SQL Server 2012 (11.x) introduced a new feature to accelerate analytical workloads: columnstore indexes. Wir haben die Anwendungsfälle erweitert und die Leistung von Columnstore-Indizes in allen nachfolgenden Releases verbessert.We expanded the use cases and improved the performance of columnstore indexes in each subsequent release. Bisher wurden diese Funktionen so dargestellt und dokumentiert, als ob es sich um genau ein Feature handeln würde.Until now, we surfaced and documented all these capabilities as a single feature. Sie erstellen die Columnstore-Indizes in Ihren Tabellen.You create columnstore indexes on your tables. Und Ihre analytische Workload wird schneller ausgeführt.And your analytical workload goes faster. Es gibt jedoch zwei miteinander zusammenhängende, aber unterschiedliche Gruppen von Technologien:However, there are two related but distinct sets of technologies:

  • Columnstore-Indizes erlauben Analyseabfragen nur den Zugriff auf die Daten in den Spalten, die sie benötigen.With columnstore indexes, analytical queries access only the data in the columns they need. Die Seitenkomprimierung im Spaltenspeicherformat ist ebenfalls effektiver als die Komprimierung in traditionellen Rowstore-Indizes.Page compression in the columnstore format is also more effective than compression in traditional rowstore indexes.
  • Mit der Verarbeitung im Batchmodus verarbeiten Abfrageoperatoren Daten effizienter.With batch mode processing, query operators process data more efficiently. Die Verarbeitung erfolgt für ein Batch an Zeilen und nicht für jede Zeile einzeln.They work on a batch of rows instead of one row at a time. Zahlreiche weitere Verbesserungen der Skalierbarkeit sind an die Batchmodusverarbeitung gebunden.A number of other scalability improvements are tied to batch mode processing. Weitere Informationen zum Batchmodus finden Sie unter Ausführungsmodi.For more information on batch mode, see Execution modes.

Die zwei Featuregruppen verbessern zusammen die E/A- und CPU-Auslastung:The two sets of features work together to improve input/output (I/O) and CPU utilization:

  • Durch Columnstore-Indizes passen mehr Daten in den Speicher.By using columnstore indexes, more of your data fits in memory. Dadurch wird die E/A-Arbeitsauslastung reduziert.That reduces the I/O workload.
  • Die Batchmodusverarbeitung nutzt die CPU effizienter.Batch mode processing uses CPU more efficiently.

Wann immer möglich, machen sich die beiden Technologien gegenseitig zu Nutze.The two technologies take advantage of each other whenever possible. So können Batchmodusaggregate z.B. als Teil eines Columnstore-Indexes ausgewertet werden.For example, batch mode aggregates can be evaluated as part of a columnstore index scan. Außerdem werden komprimierte Columnstore-Daten mit der Lauflängencodierung wesentlich effizienter mit Joins im Batchmodus und Batchmodusaggregaten verarbeitet.Also columnstore data that's compressed is processed by using run-length encoding much more efficiently with batch mode joins and batch mode aggregates.

Es ist jedoch wichtig, zu berücksichtigen, dass die beiden Merkmale unabhängig voneinander sind:It is important to understand however, that the two features are independent:

  • Sie können Zeilenmoduspläne erhalten, die Columnstore-Indizes verwenden.You can get row mode plans that use columnstore indexes.
  • Sie können Batchmoduspläne erhalten, die nur Rowstore-Indizes verwenden.You can get batch mode plans that use only rowstore indexes.

Sie erhalten in der Regel die besten Ergebnisse, wenn Sie die beiden Features zusammen verwenden.You usually get the best results when you use the two features together. Bisher betrachtete der SQL Server-Abfrageoptimierer die Verarbeitung im Batchmodus nur für Abfragen, die mindestens eine Tabelle mit einem Columnstore-Index betreffen.So until now, the SQL Server query optimizer considered batch mode processing only for queries that involve at least one table with a columnstore index.

Columnstore-Indizes sind für einige Anwendungen möglicherweise nicht geeignet.Columnstore indexes may not be appropriate for some applications. Eine Anwendung kann ein anderes Feature verwenden, das nicht von Columnstore-Indizes unterstützt wird.An application might use some other feature that isn't supported with columnstore indexes. Direkte Änderungen sind beispielsweise nicht mit der Columnstore-Komprimierung kompatibel.For example, in-place modifications are not compatible with columnstore compression. Daher werden Auslöser in Tabellen mit gruppierten Columnstore-Indizes nicht unterstützt.Therefore, triggers aren't supported on tables with clustered columnstore indexes. Noch wichtiger ist, dass DELETE- und UPDATE-Anweisungen durch Columnstore-Indizes aufwändiger werden.More importantly, columnstore indexes add overhead for DELETE and UPDATE statements.

Für einige hybride Transaktions-/Analyseworkloads überwiegt der Mehraufwand bei Transaktionsworkloads die Vorteile der Verwendung von Columnstore-Indizes für Analyseabfragen.For some hybrid transactional-analytical workloads, the overhead of a transactional workload outweighs the benefits gained from using columnstore indexes. Solche Szenarios können von einer verbesserten CPU-Auslastung profitieren, indem nur die Batchmodusverarbeitung genutzt wird.Such scenarios can benefit from improved CPU usage by employing batch mode processing alone. Aus diesem Grund berücksichtigt das Feature „Batchmodus bei Rowstore“ den Batchmodus für alle Abfragen, unabhängig davon, welche Art von Indizes beteiligt sind.That is why the batch-mode-on-rowstore feature considers batch mode for all queries regardless of what type of indexes are involved.

Workloads, die vom Batchmodus auf Rowstore profitieren könnenWorkloads that might benefit from batch mode on rowstore

Die folgenden Workloads können vom Batchmodus auf Rowstore profitieren:The following workloads might benefit from batch mode on rowstore:

  • Ein signifikanten Teil der Workload besteht aus analytischen Abfragen.A significant part of the workload consists of analytical queries. Normalerweise verwenden diese Abfragen Operatoren wie Joins oder Aggregate, die Hunderttausende von Zeilen oder mehr verarbeiten.Usually, these queries use operators like joins or aggregates that process hundreds of thousands of rows or more.
  • Die Workload ist CPU-gebunden.The workload is CPU bound. Wenn der Engpass E/A ist, wird weiterhin empfohlen, dass Sie nach Möglichkeit einen Columnstore-Index in Betracht ziehen.If the bottleneck is I/O, it is still recommended that you consider a columnstore index, where possible.
  • Das Erstellen eines Columnstore-Index fügt dem transaktionalen Teil Ihrer Workload zu viel Mehraufwand hinzu.Creating a columnstore index adds too much overhead to the transactional part of your workload. Oder es kann kein Columnstore-Index erstellt werden, da Ihre Anwendung von einem Feature abhängt, das bei Columnstore-Indizes noch nicht unterstützt wird.Or, creating a columnstore index is not feasible because your application depends on a feature that's not yet supported with columnstore indexes.

Hinweis

Batchmodus bei Rowstore kann nur bei der Verringerung des CPU-Verbrauchs helfen.Batch mode on rowstore helps only by reducing CPU consumption. Wenn Ihr Engpass E/A-bezogen ist und Daten nicht bereits zwischengespeichert werden („kalter“ Cache), verbessert Batchmodus bei Rowstore die verstrichene Abfragezeit nicht.If your bottleneck is I/O-related, and data isn't already cached ("cold" cache), batch mode on rowstore will not improve query elapsed time. Ähnlich gilt, dass eine Leistungsverbesserung unwahrscheinlich ist, wenn auf dem Computer nicht genügend Arbeitsspeicher zum Zwischenspeichern aller Daten vorhanden ist.Similarly, if there is no sufficient memory on the machine to cache all data, a performance improvement is unlikely.

Welche Änderungen mit dem Batchmodus auf Rowstore verbunden sindWhat changes with batch mode on rowstore?

Legen Sie für die Datenbank den Kompatibilitätsgrad 150 fest.Set the database to to compatibility level 150. Es sind keine weiteren Änderungen erforderlich.No other changes are required.

Auch wenn eine Abfrage nicht auf Tabellen mit Columnstore-Indizes zugreift, verwendet der Abfrageprozessor Heuristik, um zu entscheiden, ob der Batchmodus berücksichtigt wird.Even if a query does not access any tables with columnstore indexes, the query processor, using heuristics, will decide whether to consider batch mode. Die Heuristik umfasst diese Überprüfungen:The heuristics consist of these checks:

  1. Ein erstes Überprüfen der Tabellengrößen, verwendeten Operatoren und geschätzten Kardinalitäten in der Eingabeabfrage.An initial check of table sizes, operators used, and estimated cardinalities in the input query.
  2. Weitere Prüfpunkte kommen hinzu, wenn der Abfrageoptimierer neue, kostengünstigere Pläne für die Abfrage entdeckt.Additional checkpoints, as the optimizer discovers new, cheaper plans for the query. Wenn diese alternativen Pläne keine signifikante Verwendung des Batchmodus aufweisen, beendet der Optimierer die Untersuchung von Batchmodusalternativen.If these alternative plans don't make significant use of batch mode, the optimizer stops exploring batch mode alternatives.

Wenn der Batch-modus bei Rowstow verwendet wird, sehen Sie den tatsächlichen Ausführungsmodus als Batchmodus im Abfrageplan.If batch mode on rowstore is used, you see the actual run mode as batch mode in the query plan. Der Scan-Operator verwendet den Batchmodus für On-Disk-Heaps und B-Struktur-Indizes.The scan operator uses batch mode for on-disk heaps and B-tree indexes. Diese Überprüfung im Batchmodus kann Batchmodus-Bitmapfilter auswerten.This batch mode scan can evaluate batch mode bitmap filters. Vielleicht finden Sie auch andere Batchmodusoperatoren im Plan.You might also see other batch mode operators in the plan. Beispielsweise Hashjoins, hashbasierte Aggregate, Sortierungen, Fensteraggregate, Filter, Verkettung und Skalarwertberechnungs-Operatoren.Examples are hash joins, hash-based aggregates, sorts, window aggregates, filters, concatenation, and compute scalar operators.

BemerkungenRemarks

Abfragepläne verwenden nicht immer den Batchmodus.Query plans don't always use batch mode. Der Abfrageoptimierer entscheidet möglicherweise, dass der Batchmodus für die Abfrage nicht sinnvoll ist.The Query Optimizer might decide that batch mode isn't beneficial for the query.

Der Suchbereich des Abfrageoptimierers ändert sich.The Query Optimizer search space is changing. Wenn Sie also einen Zeilenmodusplan erhalten, ist er möglicherweise nicht derselbe wie der Plan, den Sie in einem niedrigeren Kompatibilitätsgrad erhalten.So if you get a row mode plan, it might not be the same as the plan you get in a lower compatibility level. Und wenn Sie einen Batchmodusplan erhalten, ist er möglicherweise nicht derselbe wie der Plan, den Sie mit einem Columnstore-Index erhalten.And if you get a batch mode plan, it might not be the same as the plan you get with a columnstore index.

Aufgrund des neuen Batchmodus-Rowstore-Scans können Pläne sich auch für Abfragen ändern, die Columnstore- und Rowstore-Indizes mischen.Plans might also change for queries that mix columnstore and rowstore indexes because of the new batch mode rowstore scan.

Aktuell bestehen folgende Einschränkungen für den neuen Batchmodus bei Rowstorescans:There are current limitations for the new batch mode on rowstore scan:

  • Er funktioniert nicht bei In-Memory-OLTP-Tabellen und kann ausschließlich für Indizes verwendet werden, die sich auf Datenträgerheaps oder in B-Strukturen befinden.It won't kick in for in-memory OLTP tables or for any index other than on-disk heaps and B-trees.
  • Er funktioniert auch nicht, wenn eine LOB-Spalte abgerufen oder gefiltert wird.It also won't kick in if a large object (LOB) column is fetched or filtered. Diese Einschränkung betrifft Spaltensätze mit geringer Dichte und XML-Spalten.This limitation includes sparse column sets and XML columns.

Es gibt Abfragen, für die der Batchmodus auch bei Columnstore-Indizes nicht verwendet wird.There are queries that batch mode isn't used for even with columnstore indexes. Beispiele sind Abfragen, die Cursor enthalten.Examples are queries that involve cursors. Dieselben Ausschlüsse gelten auch für den Batchmodus bei Rowstore.These same exclusions also extend to batch mode on rowstore.

Konfigurieren des Batchmodus bei RowstoreConfigure batch mode on rowstore

Die datenbankweite BATCH_MODE_ON_ROWSTORE-Konfiguration ist standardmäßig aktiviert.The BATCH_MODE_ON_ROWSTORE database scoped configuration is on by default. Sie deaktiviert den Batchmodus bei Rowstore, ohne dass eine Änderung des Datenbank-Kompatibilitätgrads erforderlich ist:It disables batch mode on rowstore without requiring a change in database compatibility level:

-- Disabling batch mode on rowstore
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ON_ROWSTORE = OFF;

-- Enabling batch mode on rowstore
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ON_ROWSTORE = ON;

Sie können den Batchmodus bei Rowstore über die datenbankweite Konfiguration deaktivieren.You can disable batch mode on rowstore via database scoped configuration. Sie können die Einstellung auf Abfrageebene jedoch immer noch überschreiben, indem Sie den Abfragehinweis ALLOW_BATCH_MODE verwenden.But you can still override the setting at the query level by using the ALLOW_BATCH_MODE query hint. Im folgenden Beispiel wird der Batchmodus bei Rowstore aktiviert, auch wenn die Funktion über die datenbankweite Konfiguration deaktiviert ist:The following example enables batch mode on rowstore even with the feature disabled via database scoped configuration:

SELECT [Tax Rate], [Lineage Key], [Salesperson Key], SUM(Quantity) AS SUM_QTY, SUM([Unit Price]) AS SUM_BASE_PRICE, COUNT(*) AS COUNT_ORDER
FROM Fact.OrderHistoryExtended
WHERE [Order Date Key]<=DATEADD(dd, -73, '2015-11-13')
GROUP BY [Tax Rate], [Lineage Key], [Salesperson Key]
ORDER BY [Tax Rate], [Lineage Key], [Salesperson Key]
OPTION(RECOMPILE, USE HINT('ALLOW_BATCH_MODE'));

Sie können den Batchmodus bei Rowstore auch mit dem Abfragehinweis DISALLOW_BATCH_MODE für eine bestimmte Abfrage deaktivieren.You can also disable batch mode on rowstore for a specific query by using the DISALLOW_BATCH_MODE query hint. Sehen Sie sich folgendes Beispiel an:See the following example:

SELECT [Tax Rate], [Lineage Key], [Salesperson Key], SUM(Quantity) AS SUM_QTY, SUM([Unit Price]) AS SUM_BASE_PRICE, COUNT(*) AS COUNT_ORDER
FROM Fact.OrderHistoryExtended
WHERE [Order Date Key]<=DATEADD(dd, -73, '2015-11-13')
GROUP BY [Tax Rate], [Lineage Key], [Salesperson Key]
ORDER BY [Tax Rate], [Lineage Key], [Salesperson Key]
OPTION(RECOMPILE, USE HINT('DISALLOW_BATCH_MODE'));

Weitere InformationenSee also

Leistungscenter für SQL Server-Datenbankmodul und Azure SQL-Datenbank Performance Center for SQL Server Database Engine and Azure SQL Database
Leitfaden zur Architektur der Abfrageverarbeitung Query processing architecture guide
Referenz zu logischen und physischen Showplanoperatoren Showplan logical and physical operators reference
Joins Joins
Demo zur intelligenten AbfrageverarbeitungDemonstrating Intelligent Query Processing