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

Warum CTE (Common Table Expressions) in einigen Fällen Abfragen im Vergleich zu temporären Tabellen in SQL Server verlangsamen

Die Antwort ist einfach.

SQL Server materialisiert keine CTEs. Es fügt sie ein, wie Sie den Ausführungsplänen entnehmen können.

Andere DBMS können es anders implementieren, ein bekanntes Beispiel ist Postgres, das CTEs materialisiert (es erstellt im Wesentlichen temporäre Tabellen für CTEs hinter der Haube).

Ob die explizite Materialisierung von Zwischenergebnissen in expliziten temporären Tabellen schneller ist, hängt von der Abfrage ab.

Bei komplexen Abfragen kann der Aufwand für das Schreiben und Lesen von Zwischendaten in temporäre Tabellen durch effizientere, einfachere Ausführungspläne ausgeglichen werden, die der Optimierer generieren kann.

Auf der anderen Seite ist CTE in Postgres ein "Optimierungszaun", und die Engine kann Prädikate nicht über die CTE-Grenze hinweg verschieben.

Manchmal ist ein Weg besser, manchmal ein anderer. Sobald die Abfragekomplexität einen bestimmten Schwellenwert überschreitet, kann ein Optimierer nicht alle möglichen Möglichkeiten zur Verarbeitung der Daten analysieren und muss sich auf etwas einigen. Zum Beispiel die Reihenfolge, in der die Tische zusammengefügt werden. Die Anzahl der Permutationen wächst exponentiell mit der Anzahl der zur Auswahl stehenden Tische. Optimizer hat nur eine begrenzte Zeit, um einen Plan zu erstellen, daher kann es eine schlechte Wahl treffen, wenn alle CTEs inliniert sind. Wenn Sie eine komplexe Abfrage manuell in kleinere, einfachere Abfragen aufteilen, müssen Sie verstehen, was Sie tun, aber der Optimierer hat eine bessere Chance, einen guten Plan für jede einfache Abfrage zu erstellen.