Ich habe eine Tabellenwert-UDF geschrieben, die von einem CTE gestartet wird, um eine Teilmenge der Zeilen aus einer großen Tabelle zurückzugeben. Es gibt mehrere Joins im CTE. Ein paar innere und eine linke verbinden sich mit anderen Tabellen, die nicht viele Zeilen enthalten. Das CTE hat eine WHERE-Klausel, die die Zeilen innerhalb eines Datumsbereichs zurückgibt, um nur die benötigten Zeilen zurückzugeben.SQL Server CTE in Self-Joins verwiesen langsam
Ich referenziere dann dieses CTE in 4 selbst links Joins, um Zwischensummen mit verschiedenen Kriterien zu erstellen.
Die Abfrage ist sehr komplex, aber hier ist eine vereinfachte pseudo-Version davon
WITH DataCTE as
(
SELECT [columns] FROM table
INNER JOIN table2
ON [...]
INNER JOIN table3
ON [...]
LEFT JOIN table3
ON [...]
)
SELECT [aggregates_columns of each subset] FROM DataCTE Main
LEFT JOIN DataCTE BananasSubset
ON [...]
AND Product = 'Bananas'
AND Quality = 100
LEFT JOIN DataCTE DamagedBananasSubset
ON [...]
AND Product = 'Bananas'
AND Quality < 20
LEFT JOIN DataCTE MangosSubset
ON [...]
GROUP BY [
Ich habe das Gefühl, dass SQL Server durcheinander und ruft den CTE für jeden selbst verbinden, die an von der Suche bestätigt scheint der Ausführungsplan, obwohl ich gestehe, kein Experte darin zu sein, diese zu lesen.
Ich hätte angenommen, dass SQL Server intelligent genug ist, die Datenabfrage nur einmal vom CTE durchzuführen, anstatt es mehrmals zu tun.
Ich habe den gleichen Ansatz versucht, aber anstatt ein CTE zu verwenden, um die Teilmenge der Daten zu erhalten, habe ich die select select-Abfrage wie im CTE verwendet, aber es stattdessen in eine temporäre Tabelle ausgegeben.
Die Version, die sich auf die CTE-Version bezieht, dauert 40 Sekunden. Die Version, die sich auf die temporäre Tabelle bezieht, dauert zwischen 1 und 2 Sekunden.
Warum ist SQL Server nicht intelligent genug, um die CTE-Ergebnisse im Speicher zu halten?
Ich mag CTEs, besonders in diesem Fall, da meine UDF eine Tabellenwerte ist, so dass ich alles in einer einzigen Aussage behalten konnte.
Um eine temporäre Tabelle zu verwenden, müsste ich eine UDF-Tabelle mit mehreren Anweisungen schreiben, die ich etwas weniger elegant finde.
Hatten einige von Ihnen solche Leistungsprobleme mit CTE, und wenn ja, wie haben Sie sie sortiert?
Danke,
Kharlos
Können Sie Ihren Ausführungsplan posten? –