Freigeben über


Annahme der Join-Eindämmung in der Neuen Kardinalitätsschätzung beeinträchtigt die Abfrageleistung.

Dieser Artikel hilft Ihnen beim Beheben von Leistungsproblemen, die in SQL Server 2014 und höheren Versionen auftreten können, wenn Sie Ihre Abfragen mithilfe der neuen Kardinalitätsschätzung kompilieren.

Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 3189675

Problembeschreibung

Stellen Sie sich folgendes Szenario vor:

  • Sie verwenden SQL Server 2014 oder eine höhere Version.
  • Sie führen eine Abfrage aus, die Verknüpfungen und Nicht-Verknüpfungsfilter-Prädikate enthält.
  • Sie kompilieren die Abfrage mithilfe der neuen Kardinalitätsschätzung (SQL Server) (New CE).

In diesem Szenario treten Abfrageleistungsbeeinträchtigungen auf.

Dieses Problem tritt nicht auf, wenn Sie die Abfrage mithilfe der Legacy CE kompilieren.

Ursache

Ab SQL Server 2014 wurde der Neue Kardinalitäts-Estimator (New CE) für die Datenbankkompatibilitätsebene 120 und höher eingeführt. Der neue CE ändert mehrere Annahmen aus der Legacy-CE im Modell, das vom Abfrageoptimierer verwendet wird, wenn es die Kardinalität für verschiedene Operatoren und Prädikate schätzt.

Eine dieser Änderungen bezieht sich auf die Annahme der Eindämmung von Verknüpfungen.

Das Legacy CE-Modell geht davon aus, dass Benutzer immer daten abfragen, die vorhanden sind. Dies bedeutet, dass für ein Join-Prädikat, das einen Equijoin-Vorgang für zwei Tabellen umfasst, die verknüpften Spalten auf beiden Seiten der Verknüpfung vorhanden sind. Im Vorhandensein zusätzlicher Nicht-Join-Filter-Prädikate für die Verknüpfungstabelle setzt legacy CE eine gewisse Korrelation für die Join-Prädikate und Nicht-Join-Filter-Prädikate voraus. Diese konkludente Korrelation wird als einfache Eindämmung bezeichnet.

Alternativ verwendet new CE Base Containment als Korrelation. Das neue CE-Modell geht davon aus, dass Benutzer möglicherweise Daten abfragen, die nicht vorhanden sind. Dies bedeutet, dass die Filter-Prädikate für separate Tabellen möglicherweise nicht miteinander korreliert werden. Daher verwenden wir einen probabilistischen Ansatz.

Bei vielen praktischen Szenarien schafft die Verwendung der Basiseindämmungsannahme bessere Schätzungen. Dadurch werden wiederum effizientere Abfrageplanoptionen erstellt. In manchen Situationen kann die Verwendung der Annahme der einfachen Eindämmung jedoch bessere Ergebnisse liefern. Wenn dies geschieht, können Sie eine weniger effiziente Abfrageplanauswahl erleben, wenn Sie die neue CE anstelle der Legacy CE verwenden.

Weitere Informationen zum Behandeln von Problemen im Zusammenhang mit New CE finden Sie unter Verringerte Abfrageleistung nach dem Upgrade von SQL Server 2012 oder früher auf 2014 oder höher.

Lösung

In SQL Server 2014 und höheren Versionen können Sie das Ablaufverfolgungsflaggen 9476 verwenden, um SQL Server zu erzwingen, die Annahme für einfache Eindämmung anstelle der Standardannahme der Basiseindämmung zu verwenden. Wenn Sie die Anwendungsabfrage ändern können, empfiehlt es sich, den Abfragehinweis ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS nach SQL Server 2016 (13.x) SP1 zu verwenden. Weitere Informationen finden Sie unter USE HINT. Zum Beispiel:

SELECT * FROM Table1 t1
JOIN Table2 t2
ON t1.Col1 = t2.Col1
WHERE Col1 = 10
OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'));

Wenn Sie dieses Ablaufverfolgungskennzeichnung aktivieren oder den Abfragehinweis verwenden, kann die Auswahl des Abfrageplans verbessert werden, ohne das Legacy-CE-Modell vollständig wiederherstellen zu müssen, wenn die folgenden Bedingungen zutreffen:

  • Sie haben eine suboptimale Abfrageplanauswahl, die eine allgemeine beeinträchtigte Leistung für Abfragen verursacht, die Verknüpfungen und Nicht-Join-Filter-Prädikate enthalten.
  • Sie können eine signifikante Ungenauigkeit in einer "Join-Kardinalitätsschätzung" überprüfen (d. r. die tatsächliche im Vergleich zur geschätzten Anzahl von Zeilen, die sich erheblich unterscheiden).
  • Diese Ungenauigkeit ist nicht vorhanden, wenn Sie Abfragen mithilfe der Legacy CE kompilieren.

Sie können dieses Ablaufverfolgungskennzeichnung global, auf Sitzungsebene oder auf Abfrageebene aktivieren.

Notiz

Die Verwendung von Ablaufverfolgungskennzeichnungen kann ihre Workloadleistung beeinträchtigen. Weitere Informationen finden Sie unter Hinweise (Transact-SQL) – Abfrage.