Kardinalitätsschätzung (SQL Server)Cardinality Estimation (SQL Server)

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

Der Abfrageoptimierer von SQL ServerSQL Server arbeitet kostenorientiert.The SQL ServerSQL Server Query Optimizer is a cost-based Query Optimizer. Das bedeutet, dass er die Abfragepläne zur Ausführung auswählt, die die niedrigsten geschätzten Verarbeitungskosten aufweisen.This means that it selects query plans that have the lowest estimated processing cost to execute. Der Abfrageoptimierer bestimmt die Kosten für die Ausführung eines Abfrageplans anhand zweier Hauptfaktoren:The Query Optimizer determines the cost of executing a query plan based on two main factors:

  • Die Gesamtanzahl der Zeilen, die auf den jeweiligen Stufen eines Abfrageplans verarbeitet werden. Wird als Kardinalität des Plans bezeichnet.The total number of rows processed at each level of a query plan, referred to as the cardinality of the plan.
  • Das Kostenmodell des Algorithmus, der von den in der Abfrage verwendeten Operatoren vorgeschrieben wird.The cost model of the algorithm dictated by the operators used in the query.

Der erste Faktor, die Kardinalität, wird als Eingabeparameter für den zweiten Faktor, das Kostenmodell, verwendet.The first factor, cardinality, is used as an input parameter of the second factor, the cost model. Aus diesem Grund führt eine verbesserte Kardinalität zu verbesserten geschätzten Kosten und wiederum zu schnelleren Ausführungsplänen.Therefore, improved cardinality leads to better estimated costs and, in turn, faster execution plans.

Die Kardinalitätsschätzung in SQL ServerSQL Server erfolgt in erster Linie mithilfe von Histogrammen, die gleichzeitig mit Indizes oder Statistiken erstellt werden. Der Vorgang kann entweder manuell oder automatisch ausgeführt werden.Cardinality estimation (CE) in SQL ServerSQL Server is derived primarily from histograms that are created when indexes or statistics are created, either manually or automatically. In manchen Fällen verwendet SQL ServerSQL Server auch Einschränkungsinformationen und logische Umschreibungen von Abfragen, um die Kardinalität zu bestimmen.Sometimes, SQL ServerSQL Server also uses constraint information and logical rewrites of queries to determine cardinality.

In den folgenden Fällen kann SQL ServerSQL Server die Kardinalitätswerte nicht genau berechnen.In the following cases, SQL ServerSQL Server cannot accurately calculate cardinalities. Dies führt zu ungenauen Kostenberechnungen, die wiederum nicht optimale Abfragepläne zur Folge haben.This causes inaccurate cost calculations that may cause suboptimal query plans. Die Vermeidung dieser Konstrukte in Abfragen kann die Abfrageleistung verbessern.Avoiding these constructs in queries may improve query performance. In manchen Fällen sind alternative Abfrageformulierungen oder andere Maßnahmen möglich, die nachstehend angegeben sind:Sometimes, alternative query formulations or other measures are possible and these are pointed out:

  • Abfragen mit Prädikaten, die Vergleichsoperatoren zwischen verschiedenen Spalten derselben Tabelle verwenden.Queries with predicates that use comparison operators between different columns of the same table.
  • Abfragen mit Prädikaten, die Operatoren verwenden, und für die eine der folgenden Voraussetzungen zutrifft:Queries with predicates that use operators, and any one of the following are true:
    • Es liegen keine Statistiken zu den beteiligten Spalten auf beiden Seiten der Operatoren vor.There are no statistics on the columns involved on either side of the operators.
    • Die Verteilung der Werte in den Statistiken ist nicht einheitlich, die Abfrage sucht jedoch eine sehr gezielte Wertegruppe.The distribution of values in the statistics is not uniform, but the query seeks a highly selective value set. Dieser Umstand tritt besonders dann ein, wenn ein anderer Operator als der equality-Operator (=) verwendet wird.This situation can be especially true if the operator is anything other than the equality (=) operator.
    • Das Prädikat verwendet den Ungleich-Vergleichsoperator (!=) oder den logischen Operator NOT.The predicate uses the not equal to (!=) comparison operator or the NOT logical operator.
  • Abfragen, die eine der integrierten SQL Server-Funktionen oder eine benutzerdefinierte Skalarwertfunktion verwenden, deren Argument kein konstanter Wert ist.Queries that use any of the SQL Server built-in functions or a scalar-valued, user-defined function whose argument is not a constant value.
  • Abfragen, bei denen Spalten durch arithmetische Operatoren oder Zeichenfolgenverkettungsoperatoren verknüpft werden.Queries that involve joining columns through arithmetic or string concatenation operators.
  • Abfragen, die Variablen vergleichen, deren Werte zum Zeitpunkt der Kompilierung oder Optimierung nicht bekannt sind.Queries that compare variables whose values are not known when the query is compiled and optimized.

Dieser Artikel veranschaulicht, wie Sie die beste Konfiguration für die Kardinalitätsschätzung für Ihr System bewerten und auswählen.This article illustrates how you can assess and choose the best CE configuration for your system. Die meisten Systeme profitieren von der neuesten Kardinalitätsschätzung, da sie die genaueste ist.Most systems benefit from the latest CE because it is the most accurate. Die Kardinalitätsschätzung sagt vorher, wie viele Zeilen eine Abfrage wahrscheinlich zurückgibt.The CE predicts how many rows your query will likely return. Die Vorhersage der Kardinalität wird vom Abfrageoptimierer verwendet, um einen optimalen Abfrageplan zu generieren.The cardinality prediction is used by the Query Optimizer to generate the optimal query plan. Mit genaueren Schätzungen kann der Abfrageoptimierer in der Regel einen besseren Abfrageplan erzeugen.With more accurate estimations, the Query Optimizer can usually do a better job of producing a more optimal query plan.

Möglicherweise existiert in Ihrem Anwendungssystem eine wichtige Abfrage, deren Plan aufgrund von Änderungen an der Kardinalitätsschätzung zwischen Versionen in einen langsameren Plan geändert wird.Your application system could possibly have an important query whose plan is changed to a slower plan due to changes in the CE throughout versions. Sie verfügen über Techniken und Tools, um eine Abfrage zu identifizieren, die aufgrund von Problemen bei der Kardinalitätsschätzung langsamer ausgeführt wird.You have techniques and tools for identifying a query that performs slower due to CE issues. Darüber hinaus verfügen Sie über Optionen, wie Sie das daraus resultierende Leistungsproblem beheben.And you have options for how to address the ensuing performance issues.

Versionen der KardinalitätsschätzungVersions of the CE

1998 war ein großes Update der Kardinalitätsschätzung Teil von SQL ServerSQL Server 7.0, dessen Kompatibilitätsgrad 70 betrug.In 1998, a major update of the CE was part of SQL ServerSQL Server 7.0, for which the compatibility level was 70. Diese Version des Modells der Kardinalitätsschätzung baut auf vier grundlegenden Annahmen auf:This version of the CE model is set on four basic assumptions:

  • Unabhängigkeit: Es wird angenommen, dass Datenverteilungen in verschiedenen Spalten unabhängig voneinander sind, es sei denn, Korrelationsinformationen sind verfügbar und verwendbar.Independence: Data distributions on different columns are assumed to be independent of each other, unless correlation information is available and usable.
  • Einheitlichkeit: Unterschiedliche Werte haben denselben Abstand und dieselbe Häufigkeit.Uniformity: Distinct values are evenly spaced and that they all have the same frequency. Genauer gesagt, sind DISTINCT-Werte innerhalb der Schritte eines Histogramms gleichmäßig verteilt, und jeder Wert weist dieselbe Häufigkeit auf.More precisely, within each histogram step, distinct values are evenly spread and each value has same frequency.
  • Einschluss (einfach): Benutzer fragen Daten ab, die bereits vorhanden sind.Containment (Simple): Users query for data that exists. Bei einem Gleichheits-Join von zwei Tabellen sollten Sie z.B. die Selektivität1 von Prädikaten in jedem Eingabehistogramm berücksichtigen, bevor Sie Histogramme verknüpfen, um die Joinselektivität zu schätzen.For example, for an equality join between two tables, factor in the predicates selectivity1 in each input histogram, before joining histograms to estimate the join selectivity.
  • Aufnahme: Bei Filterprädikaten, in denen Column = Constant gilt, wird angenommen, dass sie für die zugeordnete Spalte tatsächlich vorhanden sind.Inclusion: For filter predicates where Column = Constant, the constant is assumed to actually exist for the associated column. Wenn ein entsprechender Histogrammschritt nicht leer ist, wird angenommen, dass einer der DISTINCT-Werte des Schritts dem Wert des Prädikats entspricht.If a corresponding histogram step is non-empty, one of the step's distinct values is assumed to match the value from the predicate.

1 Zeilenanzahl, die dem Prädikat entspricht1 Row count that satisfies the predicate.

Spätere Updates beginnen mit SQL Server 2014 (12.x)SQL Server 2014 (12.x), also mit Kompatibilitätsgrad 120 und höher.Subsequent updates started with SQL Server 2014 (12.x)SQL Server 2014 (12.x), meaning compatibility levels 120 and above. Die Updates der Kardinalitätsschätzung für die Kompatibilitätsgrade 120 und höher umfassen aktualisierte Annahmen und Algorithmen, die für moderne Data Warehousing- und OLTP-Workloads gut funktionieren.The CE updates for levels 120 and above incorporate updated assumptions and algorithms that work well on modern data warehousing and on OLTP workloads. Aus den Annahmen der Kardinalitätsschätzung 70 wurden ab Kardinalitätsschätzung 120 die folgenden Modellannahmen geändert:From the CE 70 assumptions, the following model assumptions were changed starting with CE 120:

  • Unabhängigkeit wird zu Korrelation: Die Kombination der verschiedenen Spaltenwerte ist nicht unbedingt unabhängig.Independence becomes Correlation: The combination of the different column values are not necessarily independent. Dies ähnelt eher einer realistischen Datenabfrage.This may resemble more real-life data querying.
  • Der einfache Einschluss wird zu Basiseinschluss: Möglicherweise fragen Benutzer Daten ab, die nicht vorhanden sind.Simple Containment becomes Base Containment: Users might query for data that does not exist. Bei einem Gleichheits-Join von zwei Tabellen nutzen wir die Basistabellenhistogramme, um die Joinselektivität zu schätzen, und berücksichtigen anschließend die Selektivität der Prädikate.For example, for an equality join between two tables, we use the base tables histograms to estimate the join selectivity, and then factor in the predicates selectivity.

Kompatibilitätsgrad: Sie können sicherstellen, dass ein bestimmter Grad für Ihre Datenbank gilt, indem Sie den folgenden Transact-SQLTransact-SQL-Code für COMPATIBILITY_LEVEL ausführen.Compatibility level: You can ensure your database is at a particular level by using the following Transact-SQLTransact-SQL code for COMPATIBILITY_LEVEL.

SELECT ServerProperty('ProductVersion');  
GO  
  
ALTER DATABASE <yourDatabase>  
SET COMPATIBILITY_LEVEL = 130;  
GO  
  
SELECT d.name, d.compatibility_level  
FROM sys.databases AS d  
WHERE d.name = 'yourDatabase';  
GO  

In einer SQL ServerSQL Server-Datenbank, die mit dem Kompatibilitätsgrad 120 oder höher eingerichtet wurde, zwingt die Aktivierung des Ablaufverfolgungsflags 9481 das System dazu, Version 70 der Kardinalitätsschätzung zu verwenden.For a SQL ServerSQL Server database set at compatibility level 120 or above, activation of the trace flag 9481 forces the system to use the CE version 70.

Ältere Kardinalitätsschätzung: In einer SQL ServerSQL Server-Datenbank, die mit dem Kompatibilitätsgrad 120 oder höher eingerichtet wurde, kann Version 70 der Kardinalitätsschätzung aktiviert werden. Verwenden Sie dazu ALTER DATABASE SCOPED CONFIGURATION auf Datenbankebene.Legacy CE: For a SQL ServerSQL Server database set at compatibility level 120 and above, the CE version 70 can be can be activated by using the at the database level by using the ALTER DATABASE SCOPED CONFIGURATION.

ALTER DATABASE SCOPED CONFIGURATION 
SET LEGACY_CARDINALITY_ESTIMATION = ON;  
GO  
  
SELECT name, value  
FROM sys.database_scoped_configurations  
WHERE name = 'LEGACY_CARDINALITY_ESTIMATION';  
GO

Alternativ ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 den Abfragehinweis USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION').Or starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1, the Query Hint USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION').

SELECT CustomerId, OrderAddedDate  
FROM OrderTable  
WHERE OrderAddedDate >= '2016-05-01'
OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'));  

Abfragespeicher: Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) ist der Abfragespeicher ein praktisches Tool zum Untersuchen der Leistung Ihrer Abfragen.Query store: Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the query store is a handy tool for examining the performance of your queries. In Management StudioManagement Studio wird im Objekt-Explorer unterhalb des Knotens Ihrer Datenbank ein Knoten Abfragespeicher angezeigt, wenn der Abfragespeicher aktiviert ist.In Management StudioManagement Studio, in the Object Explorer under your database node, a Query Store node is displayed when the query store is enabled.

ALTER DATABASE <yourDatabase>  
SET QUERY_STORE = ON;  
GO  
  
SELECT q.actual_state_desc AS [actual_state_desc_of_QueryStore],  
        q.desired_state_desc,  
        q.query_capture_mode_desc  
FROM sys.database_query_store_options AS q;  
GO  
  
ALTER DATABASE <yourDatabase>  
SET QUERY_STORE CLEAR;  

Tipp

Es wird empfohlen, die neueste Version von Management Studio zu installieren und häufig zu aktualisieren.We recommend that you install the latest release of Management Studio and update it often.

Wichtig

Stellen Sie sicher, dass der Abfragespeicher korrekt für Ihre Datenbank und Ihre Arbeitsauslastung konfiguriert ist.Ensure the Query Store is correctly configured for your database and workload. Weitere Informationen finden Sie unter Bewährte Methoden für den Abfragespeicher.For more information, see Best practices with Query Store.

Eine andere Option zum Nachverfolgen des Prozesses der Kardinalitätsschätzung ist die Verwendung des erweiterten Ereignisses query_optimizer_estimate_cardinality.Another option for tracking the cardinality estimation process is to use the extended event named query_optimizer_estimate_cardinality. Das folgende Transact-SQLTransact-SQL-Codebeispiel wird in SQL ServerSQL Server ausgeführt.The following Transact-SQLTransact-SQL code sample runs on SQL ServerSQL Server. Es schreibt eine XEL-Datei in C:\Temp\ (Sie können den Pfad ändern).It writes a .xel file to C:\Temp\ (although you can change the path). Wenn Sie die XEL-Datei in Management StudioManagement Studio öffnen, werden die detaillierten Daten in einer von Benutzern gut lesbaren Weise angezeigt.When you open the .xel file in Management StudioManagement Studio, its detailed information is displayed in a user friendly manner.

DROP EVENT SESSION Test_the_CE_qoec_1 ON SERVER;  
go  
  
CREATE EVENT SESSION Test_the_CE_qoec_1  
ON SERVER  
ADD EVENT sqlserver.query_optimizer_estimate_cardinality  
    (  
        ACTION (sqlserver.sql_text)  
            WHERE (  
                sql_text LIKE '%yourTable%'  
                and sql_text LIKE '%SUM(%'  
            )  
    )  
ADD TARGET package0.asynchronous_file_target   
        (SET  
            filename = 'c:\temp\xe_qoec_1.xel',  
            metadatafile = 'c:\temp\xe_qoec_1.xem'  
        );  
GO  
  
ALTER EVENT SESSION Test_the_CE_qoec_1  
ON SERVER  
STATE = START;  --STOP;  
GO  

Informationen zu erweiterten Ereignissen, die speziell auf SQL-DatenbankSQL Database zugeschnitten sind, finden Sie unter Erweiterte Ereignisse in SQL-Datenbank.For information about extended events as tailored for SQL-DatenbankSQL Database, see Extended events in SQL Database.

Schritte für die Bewertung der Version der KardinalitätsschätzungSteps to assess the CE version

Mit den folgenden Schritten können Sie ermitteln, ob Ihre wichtigsten Abfragen mit der neuesten Kardinalitätsschätzung mit geringerer Leistung ausgeführt werden.Next are steps you can use to assess whether any of your most important queries perform less well under the latest CE. In einigen der Schritte wird ein Codebeispiel ausgeführt, das im vorherigen Abschnitt vorgestellt wurde.Some of the steps are performed by running a code sample presented in a preceding section.

  1. Öffnen Sie Management StudioManagement Studio.Open Management StudioManagement Studio. Stellen Sie sicher, dass für Ihre SQL ServerSQL Server-Datenbank der höchste verfügbare Kompatibilitätsgrad festgelegt wurde.Ensure your SQL ServerSQL Serverdatabase is set to the highest available compatibility level.

  2. Führen Sie die folgenden vorbereitenden Schritte aus:Perform the following preliminary steps:

    1. Öffnen Sie Management StudioManagement Studio.Open Management StudioManagement Studio.

    2. Führen Sie T-SQL aus, um sicherzustellen, dass für Ihre SQL ServerSQL Server-Datenbank der höchste verfügbare Kompatibilitätsgrad festgelegt wurde.Run the T-SQL to ensure that your SQL ServerSQL Server database is set to the highest available compatibility level.

    3. Stellen Sie sicher, dass die LEGACY_CARDINALITY_ESTIMATION-Konfiguration Ihrer Datenbank deaktiviert ist.Ensure that your database has its LEGACY_CARDINALITY_ESTIMATION configuration turned OFF.

    4. Bereinigen Sie Ihren Abfragespeicher.Clear your Query Store. Stellen Sie sicher, dass Ihr Abfragespeicher aktiviert ist.Ensure your Query Store is ON.

    5. Führen Sie die Anweisung SET NOCOUNT OFF; aus.Run the statement: SET NOCOUNT OFF;

  3. Führen Sie die Anweisung SET STATISTICS XML ON; aus.Run the statement: SET STATISTICS XML ON;

  4. Führen Sie Ihre wichtige Abfrage aus.Run your important query.

  5. Beachten Sie im Ergebnisbereich auf der Registerkarte Meldungen die tatsächliche Anzahl von betroffenen Zeilen.In the results pane, on the Messages tab, note the actual number of rows affected.

  6. Doppelklicken Sie im Ergebnisbereich auf der Registerkarte Ergebnisse auf die Zelle, die die Statistik im XML-Format enthält.In the results pane on the Results tab, double-click the cell that contains the statistics in XML format. Es wird ein grafischer Abfrageplan angezeigt.A graphic query plan is displayed.

  7. Klicken Sie mit der rechten Maustaste auf das erste Feld im grafischen Abfrageplan, und klicken Sie dann auf Eigenschaften.Right-click the first box in the graphic query plan, and then click Properties.

  8. Notieren Sie die Werte für die folgenden Eigenschaften, um diese später mit einer anderen Konfiguration vergleichen zu können:For later comparison with a different configuration, note the values for the following properties:

    • CardinalityEstimationModelVersion.CardinalityEstimationModelVersion.

    • Geschätzte Anzahl von Zeilen.Estimated Number of Rows.

    • Geschätzte E/A-Kostensowie einige weitere ähnliche geschätzte Eigenschaften, die sich eher auf die tatsächliche Leistung als auf Vorhersagen zur Zeilenanzahl beziehen.Estimated I/O Cost, and several similar Estimated properties that involve actual performance rather than row count predictions.

    • Logische Operation und Physische Operation.Logical Operation and Physical Operation. Parallelität ist ein guter Wert.Parallelism is a good value.

    • Tatsächlicher Ausführungsmodus.Actual Execution Mode. Batch ist ein guter Wert und besser als Zeile.Batch is a good value, better than Row.

  9. Vergleichen Sie die geschätzte Anzahl von Zeilen mit der tatsächliche Zeilenanzahl.Compare the estimated number of rows to the actual number of rows. Ist die Kardinalitätsschätzung um 1% oder um 10% ungenau (höher oder niedriger)?Is the CE inaccurate by 1% (high or low), or by 10%?

  10. Führen Sie SET STATISTICS XML OFF; aus.Run: SET STATISTICS XML OFF;

  11. Führen Sie den T-SQL-Code aus, um den Kompatibilitätsgrad Ihrer Datenbank um eine Stufe zu senken (z.B. von 130 auf 120).Run the T-SQL to decrease the compatibility level of your database by one level (such as from 130 down to 120).

  12. Führen Sie alle Schritte erneut aus, die keine Vorbereitungsschritte sind.Rerun all the non-preliminary steps.

  13. Vergleichen Sie die Eigenschaftswerte der Kardinalitätsschätzung der beiden Ausführungen.Compare the CE property values from the two runs.

    • Ist der Prozentsatz der Ungenauigkeit mit der neuesten Kardinalitätsschätzung geringer als mit der älteren?Is the inaccuracy percentage under the newest CE less than under the older CE?
  14. Vergleichen Sie zum Schluss die verschiedenen Leistungswerte der beiden Ausführungen.Finally, compare the various performance property values from the two runs.

    • Hat Ihre Abfrage bei den beiden verschiedenen Kardinalitätsschätzungen unterschiedliche Abfragepläne verwendet?Did your query use a different plan under the two differing CE estimations?

    • Wurde Ihre Abfrage mit der neuesten Kardinalitätsschätzung langsamer ausgeführt?Did your query run slower under the latest CE?

    • Wenn Ihre Abfrage nicht mit der älteren Kardinalitätsschätzung besser und unter einem anderen Plan ausgeführt wird als mit der neuen Schätzung, sollten Sie mit größter Wahrscheinlichkeit die neueste Kardinalitätsschätzung verwenden.Unless your query runs better and with a different plan under the older CE, you almost certainly want the latest CE.

    • Wenn Ihre Abfrage allerdings mit der älteren Kardinalitätsschätzung unter einem schnelleren Plan ausgeführt wird, sollten Sie erwägen, Ihr System zu zwingen, den schnelleren Plan zu verwenden und die Kardinalitätsschätzung zu ignorieren.However, if your query runs with a faster plan under the older CE, consider forcing the system to use the faster plan and to ignore the CE. Auf diese Weise können Sie die neueste Kardinalitätsschätzung allgemein im System verwenden, für Sonderfälle aber den schnelleren Plan beibehalten.This way you can have the latest CE on for everything, while keeping the faster plan in the one odd case.

Aktivieren des besten AbfrageplansHow to activate the best query plan

Angenommen, mit der Kardinalitätsschätzung 120 oder höher wird ein langsamerer Abfrageplan für Ihre Abfrage generiert.Suppose that with CE 120 or above, a less efficient query plan is generated for your query. Für diesen Fall finden Sie hier einige Optionen, mit denen Sie den besseren Plan aktivieren können:Here are some options you have to activate the better plan:

  1. Sie können den Kompatibilitätsgrad für Ihre gesamte Datenbank auf einen niedrigeren Wert als den neuesten verfügbaren Grad festlegen.You could set the compatibility level to a value lower than the latest available, for your whole database.

    • Wenn Sie z.B. den Kompatibilitätsgrad auf 110 oder niedriger festlegen, wird die Kardinalitätsschätzung 70 aktiviert, obwohl alle Abfragen dem vorherigen Kardinalitätsschätzungsmodell unterliegen.For example, setting the compatibility level 110 or lower activates CE 70, but it makes all queries subject to the previous CE model.

    • Beim Festlegen eines niedrigeren Kompatibilitätsgrads werden außerdem viele Verbesserungen des Abfrageoptimierers für die neuesten Versionen nicht genutzt.Further, setting a lower compatibility level also misses a number of improvements in the query optimizer for latest versions.

  2. Sie können die Datenbankoption LEGACY_CARDINALITY_ESTIMATION verwenden, sodass die gesamte Datenbank die ältere Kardinalitätsschätzung verwendet, die Verbesserungen des Abfrageoptimierers jedoch beibehalten werden.You could use LEGACY_CARDINALITY_ESTIMATION database option, to have the whole database use the older CE, while retaining other improvements in the query optimizer.

  3. Sie können den Abfragehinweis LEGACY_CARDINALITY_ESTIMATION verwenden, sodass eine einzelne Abfrage die ältere Kardinalitätsschätzung verwendet, die Verbesserungen des Abfrageoptimierers jedoch beibehalten werden.You could use LEGACY_CARDINALITY_ESTIMATION query hint, to have a single query use the older CE, while retaining other improvements in the query optimizer.

Die genaueste Steuerung erzielen Sie, indem Sie erzwingen, dass das System den Plan verwendet, der während der Testphase mit der Kardinalitätsschätzung 70 generiert wurde.For the finest control, you could force the system to use the plan that was generated with CE 70 during your testing. Nachdem Sie den bevorzugten Plan angeheftet haben, können Sie die gesamte Datenbank für die Verwendung des neuesten Kompatibilitätsgrad und der neuesten Kardinalitätsschätzung einrichten.After you pin your preferred plan, you can set your whole database to use the latest compatibility level and CE. Diese Option wird im nächsten Abschnitt erläutert.The option is elaborated next.

Erzwingen eines bestimmten AbfrageplansHow to force a particular query plan

Der Abfragespeicher bietet verschiedene Möglichkeiten, das System zur Verwendung eines bestimmten Abfrageplans zu zwingen:The query store gives you different ways that you can force the system to use a particular query plan:

  • Führen Sie sp_query_store_force_planaus.Execute sp_query_store_force_plan.

  • Erweitern Sie in Management StudioManagement Studio den Knoten für Ihren Abfragespeicher, klicken Sie mit der rechten Maustaste auf Knoten mit dem höchsten Ressourcenverbrauch, und klicken Sie dann auf Knoten mit dem höchsten Ressourcenverbrauch anzeigen.In Management StudioManagement Studio, expand your Query Store node, right-click Top Resource Consuming Nodes, and then click View Top Resource Consuming Nodes. Es werden die Schaltflächen Plan erzwingen und Erzwingung des Plans aufhebenangezeigt.The display shows buttons labeled Force Plan and Unforce Plan.

Weitere Informationen zum Abfragespeicher finden Sie unter Überwachen der Leistung mit dem Abfragespeicher.For more information about the query store, see Monitoring Performance By Using the Query Store.

Beispiele für Verbesserungen der KardinalitätsschätzungExamples of CE improvements

Dieser Abschnitt enthält Beispielabfragen, die von den Erweiterungen der Kardinalitätsschätzung in neueren Versionen profitieren.This section describes example queries that benefit from the enhancements implemented in the CE in recent releases. Hierbei handelt es sich um Hintergrundinformationen, die keine bestimmte Aktion Ihrerseits erfordern.This is background information that does not call for specific action on your part.

Beispiel A. Die Kardinalitätsschätzung berücksichtigt, dass Maximalwerte höher sein können als bei der letzten Erfassung der StatistikenExample A. CE understands maximum value might be higher than when statistics were last gathered

Angenommen, die Statistiken für OrderTable wurden zuletzt am 2016-04-30 erstellt, als der maximale Wert für OrderAddedDate``2016-04-30 entsprach.Suppose statistics were last gathered for OrderTable on 2016-04-30, when the maximum OrderAddedDate was 2016-04-30. Bei der Kardinalitätsschätzung 120 (und höher) wird berücksichtigt, dass Spalten in OrderTable mit ansteigenden Daten Werte aufweisen können, die über dem von der Statistik aufgezeichneten Maximalwert liegen.The CE 120 (and above version) understands that columns in OrderTable which have ascending data might have values larger than the maximum recorded by the statistics. Dies verbessert den Abfrageplan für Transact-SQLTransact-SQL-SELECT-Anweisungen wie die folgende.This understanding improves the query plan for Transact-SQLTransact-SQL SELECT statements such as the following.

SELECT CustomerId, OrderAddedDate  
FROM OrderTable  
WHERE OrderAddedDate >= '2016-05-01';  

Beispiel B. Die Kardinalitätsschätzung berücksichtigt, dass gefilterte Prädikate in der gleichen Tabelle häufig korrelieren.Example B. CE understands that filtered predicates on the same table are often correlated

Die folgende SELECT-Anweisung zeigt gefilterte Prädikate für Model und ModelVariant.In the following SELECT we see filtered predicates on Model and ModelVariant. Wenn Model „Xbox“ ist, verstehen wir intuitiv, dass die Möglichkeit besteht, dass ModelVariant „One“ ist, da es von „Xbox“ eine Variante namens „One“ gibt.We intuitively understand that when Model is 'Xbox' there is a chance the ModelVariant is 'One', given that Xbox has a variant called One.

Ab der Kardinalitätsschätzung 120 berücksichtigt SQL ServerSQL Server, dass eine Korrelation zwischen den Spalten Model und ModelVariant existieren kann, die sich in der gleichen Tabelle befinden.Starting with CE 120, SQL ServerSQL Server understands there might be a correlation between the two columns on the same table, Model and ModelVariant. Die Kardinalitätsschätzung kann genauer einschätzen, wie viele Zeilen von der Abfrage zurückgegeben werden, und der Abfrageoptimierer generiert einen besseren Plan.The CE makes a more accurate estimation of how many rows will be returned by the query, and the query optimizer generates a more optimal plan.

SELECT Model, Purchase_Price  
FROM dbo.Hardware  
WHERE Model = 'Xbox' AND  
      ModelVariant = 'One';  

Beispiel C. Die Kardinalitätsschätzung geht nicht mehr von einer Korrelation zwischen gefilterten Prädikaten aus verschiedenen Tabellen ausExample C. CE no longer assumes any correlation between filtered predicates from different tables

Umfangreiche neue Untersuchungen moderner Arbeitslasten und tatsächlicher Geschäftsdaten haben ergeben, dass Prädikatfilter aus unterschiedlichen Tabellen üblicherweise nicht korrelieren.With extense new research on modern workloads and actual business data reveal that predicate filters from different tables usually do not correlate with each other. In der folgenden Abfrage nimmt die Kardinalitätsschätzung an, dass zwischen s.type und r.date kein Zusammenhang besteht.In the following query, the CE assumes there is no correlation between s.type and r.date. Daher wird die Anzahl der zurückgegebenen Zeilen niedriger eingeschätzt.Therefore the CE makes a lower estimate of the number of rows returned.

SELECT s.ticket, s.customer, r.store  
FROM dbo.Sales AS s  
CROSS JOIN dbo.Returns AS r  
WHERE s.ticket = r.ticket AND  
      s.type = 'toy' AND  
      r.date = '2016-05-11';  

Weitere InformationenSee Also

Überwachen und Optimieren der Leistung Monitor and Tune for Performance
Optimizing Your Query Plans with the SQL Server 2014 Cardinality EstimatorOptimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator
Abfragehinweise Query Hints
Abfragehinweise „USE HINT“ USE HINT Query Hints
Upgraden von Datenbanken mit dem Abfrageoptimierungs-Assistenten Upgrading Databases by using the Query Tuning Assistant
Überwachen der Leistung mit dem Abfragespeicher Monitoring Performance By Using the Query Store
Handbuch zur Architektur der AbfrageverarbeitungQuery Processing Architecture Guide