Zorg ervoor dat u de uitvoerings- + gegevenscaches leegmaakt tussen elke testrun.
bijv.
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Als u eerst met UNION ALL werkt en daarna de 2 selecties afzonderlijk uitvoert, worden de gegevens al in het geheugen opgeslagen, waardoor de prestaties veel beter zijn (waardoor u de valse indruk wekt dat de daaropvolgende aanpak sneller is, terwijl dit misschien niet het geval is).
Als je een UNION hebt gebruikt, is dat misschien langzamer omdat het een DISTINCT moet toepassen, maar UNION ALL hoeft dat niet te doen, dus het zou niet anders moeten zijn.
Bijwerken:
Bekijk de uitvoeringsplannen en vergelijk ze - kijk of er een verschil is. U kunt het uitvoeringsplan bekijken door in SSMS op de knop "Actueel uitvoeringsplan opnemen" te klikken voordat u de query uitvoert
Update 2:
Op basis van de gegeven volledige CTE's, denk ik dat ik deze zou willen optimaliseren - ik denk niet dat UNION ALL het probleem is.
IMHO, het beste is om de CTE's één voor één te doorlopen en ze allemaal afzonderlijk te optimaliseren, zodat ze beter presteren wanneer je ze vervolgens allemaal in de hoofdquery combineert.
bijv. voor tDictionaryStreets, wat dacht je ervan om dit te proberen:
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 op elke tabel moet op zijn minst een index hebben. Probeer tDictionarySubCities ook op dezelfde manier te bewerken met joins.