Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gibt es einen Leistungsunterschied zwischen CTE, Unterabfrage, temporärer Tabelle oder Tabellenvariable?

SQL ist eine deklarative Sprache, keine prozedurale Sprache. Das heißt, Sie erstellen eine SQL-Anweisung, um die gewünschten Ergebnisse zu beschreiben. Sie sagen der SQL-Engine nicht wie um die Arbeit zu erledigen.

Als allgemeine Regel ist es eine gute Idee, die SQL-Engine und den SQL-Optimierer den besten Abfrageplan finden zu lassen. In die Entwicklung einer SQL-Engine fließen viele Personenjahre an Arbeit, also lassen Sie die Ingenieure tun, was sie können.

Natürlich gibt es Situationen, in denen der Abfrageplan nicht optimal ist. Dann möchten Sie Abfragehinweise verwenden, die Abfrage neu strukturieren, Statistiken aktualisieren, temporäre Tabellen verwenden, Indizes hinzufügen usw., um eine bessere Leistung zu erzielen.

Zu deiner Frage. Die Leistung von CTEs und Unterabfragen sollte theoretisch gleich sein, da beide dem Abfrageoptimierer die gleichen Informationen liefern. Ein Unterschied besteht darin, dass ein mehr als einmal verwendeter CTE einfach identifiziert und einmal berechnet werden kann. Die Ergebnisse konnten dann gespeichert und mehrfach gelesen werden. Unglücklicherweise scheint SQL Server diese grundlegende Optimierungsmethode nicht zu nutzen (man könnte diese übliche Eliminierung von Unterabfragen nennen).

Temporäre Tabellen sind eine andere Sache, da Sie mehr Hinweise dazu geben, wie die Abfrage ausgeführt werden sollte. Ein wesentlicher Unterschied besteht darin, dass der Optimierer Statistiken aus der temporären Tabelle verwenden kann, um seinen Abfrageplan zu erstellen. Dies kann zu Leistungssteigerungen führen. Wenn Sie einen komplizierten CTE (Unterabfrage) haben, der mehr als einmal verwendet wird, führt das Speichern in einer temporären Tabelle häufig zu einer Leistungssteigerung. Die Abfrage wird nur einmal ausgeführt.

Die Antwort auf Ihre Frage lautet, dass Sie herumspielen müssen, um die erwartete Leistung zu erzielen, insbesondere bei komplexen Abfragen, die regelmäßig ausgeführt werden. In einer idealen Welt würde der Abfrageoptimierer den perfekten Ausführungspfad finden. Obwohl dies häufig der Fall ist, können Sie möglicherweise einen Weg finden, um eine bessere Leistung zu erzielen.