Stellen Sie sicher, dass Sie die Ausführungs- und Daten-Caches zwischen jedem Testlauf löschen.
zB
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Wenn Sie zuerst UNION ALL ausführen und anschließend die 2 Auswahlen separat ausführen, werden die Daten bereits im Speicher zwischengespeichert, wodurch die Leistung erheblich verbessert wird (wodurch der falsche Eindruck entsteht, dass der nachfolgende Ansatz schneller ist, wenn dies möglicherweise nicht der Fall ist).
Wenn Sie eine UNION verwendet haben, dann kann dies durchaus langsamer sein, da ein DISTINCT angewendet werden muss, aber UNION ALL muss dies nicht tun, also sollte es nicht anders sein.
Aktualisierung:
Schauen Sie sich die Ausführungspläne an und vergleichen Sie sie - sehen Sie, ob es Unterschiede gibt. Sie können den Ausführungsplan anzeigen, indem Sie in SSMS auf die Schaltfläche „Aktuellen Ausführungsplan einschließen“ klicken, bevor Sie die Abfrage ausführen
Aktualisierung 2:
Basierend auf den angegebenen vollständigen CTEs denke ich, dass ich versuchen würde, diese zu optimieren - ich glaube nicht, dass UNION ALL tatsächlich das Problem ist.
Meiner Meinung nach ist es am besten, die CTEs einzeln durchzugehen und zu versuchen, sie einzeln zu optimieren, damit sie eine bessere Leistung erzielen, wenn Sie sie alle in der Hauptabfrage kombinieren.
z.B. für tDictionaryStreets, wie wäre es damit:
SELECT DISTINCT
r.KladrItemName AS RegionName,
a.KladrItemName AS AreaName,
c.KladrItemName AS CityName,
sc.KladrItemName AS SubCityName,
s.StreetName
FROM StreetNames s
JOIN tFoundStreets fs ON s.StreetName = fs.KladrItemName
LEFT JOIN tFoundRegions r ON s.RegionName = r.KladrItemName
LEFT JOIN tFoundAreas a ON s.AreaName = a.KladrItemName
LEFT JOIN tFoundCities c ON s.CityName = c.KladrItemName
LEFT JOIN tFoundSubCities sc ON s.SubCityName = scc.KladrItemName
KladrItemName auf jeder Tabelle sollte zumindest einen Index haben. Versuchen Sie auch, tDictionarySubCities auf die gleiche Weise mit Joins zu überarbeiten.