Problembeschreibung
Wenn Sie eine Tabellenvariable mit vielen Zeilen füllen und dann mit anderen Tabellen verknüpfen, kann der Abfrageoptimierer einen ineffizienten Abfrageplan auswählen, der zu einer verlangsamten Abfrageleistung führen kann.
Fehlerbehebung
Nachdem Sie diesen Hotfix angewendet haben, können Sie das Ablaufverfolgungsflag 2453 aktivieren, damit eine Tabellenvariable eine erneute Kompilierung auslösen kann, wenn genügend Zeilenanzahl geändert wird. Auf diese Weise kann der Abfrageoptimierer einen effizienteren Plan auswählen. Das Problem wurde zunächst in den folgenden kumulativen Updates oder/und Service Packs für SQL Server behoben.
Kumulatives Update 3 für SQL Server 2014 /en-us/help/2984923
Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und alle Sicherheitsupdates, die im vorherigen kumulativen Update enthalten waren. Schauen Sie sich die neuesten kumulativen Updates für SQL Server an:
Service Packs sind kumulativ. Jedes neue Service Pack enthält neben neuen Updates alle Updates früherer Service Packs. Wir empfehlen, das neueste Service Pack und das neueste kumulative Update für dieses Service Pack zu verwenden. Sie müssen also keine älteren Versionen eines Service Packs installieren, bevor Sie das neueste Service Pack installieren. Verwenden Sie Tabelle 1 im folgenden Artikel, um weitere Informationen zum neuesten Service Pack und dem neuesten kumulativen Update zu finden:
Ermitteln der Versions-, Editions-und Update Ebene von SQL Server und dessen Komponenten
Weitere Informationen
Wenn Sie eine Tabellenvariable in einem Batch oder einer Prozedur verwenden, wird die Abfrage kompiliert und für den anfänglichen leeren Zustand der Tabellenvariablen optimiert. Wenn diese Tabellenvariable zur Laufzeit mit vielen Zeilen gefüllt ist, ist der vorkompilierte Abfrageplan möglicherweise nicht mehr optimal. Beispielsweise kann die Abfrage einer Tabellenvariablen mit einer geschachtelten Schleife beitreten, da Sie für eine geringe Anzahl von Zeilen in der Regel effizienter ist. Dieser Abfrageplan kann ineffizient sein, wenn die Tabellenvariable Millionen von Zeilen enthält. Eine Hash-Verknüpfung ist unter solchen Bedingungen möglicherweise eine bessere Wahl. Um einen neuen Abfrageplan abzurufen, muss er erneut kompiliert werden. Im Gegensatz zu anderen Benutzer-oder temporären Tabellen löst die Änderung der Zeilenanzahl in einer Tabellenvariablen keine erneute Kompilierung einer Abfrage aus. In der Regel können Sie dies mit der Option (neu kompilieren) umgehen, die eigene Overhead-Kosten hat. Das Ablaufverfolgungsflag 2453 ermöglicht den Vorteil einer Abfragekompilierung ohne Option (neu kompilieren). Dieses Ablaufverfolgungsflag unterscheidet sich von Option (neu kompilieren) in zwei Hauptaspekten. (1) Es wird derselbe Schwellenwert für die Zeilenanzahl wie bei anderen Tabellen verwendet. Die Abfrage muss nicht für jede Ausführung im Gegensatz zur Option (neu kompilieren) kompiliert werden. Eine Neukompilierung wird nur ausgelöst, wenn die Änderung der Zeilenanzahl den vordefinierten Schwellenwert überschreitet. (2) die Option (neu kompilieren) zwingt die Abfrage dazu, Parameter einzusehen und die Abfrage für Sie zu optimieren. Mit diesem Ablaufverfolgungsflag wird das einspähen des Parameters nicht erzwungen.Hinweis dieses Ablaufverfolgungsflag muss zur Laufzeit aktiviert sein. Sie können dieses Ablaufverfolgungsflag nicht mit QUERYTRACEON verwenden. Dieses Ablaufverfolgungsflag muss mit Bedacht verwendet werden, da es die Anzahl der erneuten Abfragekompilierungen erhöhen kann, die mehr als Einsparungen durch eine bessere Abfrageoptimierung Kosten könnten.
Status
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.