Assurez-vous d'effacer les caches d'exécution et de données entre chaque test.
ex.
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Si vous exécutez d'abord avec UNION ALL, puis exécutez les 2 sélections séparément par la suite, les données seront déjà mises en cache dans la mémoire, ce qui améliore considérablement les performances (donnant ainsi la fausse impression que l'approche suivante est plus rapide alors qu'elle ne l'est peut-être pas). /P>
Si vous avez utilisé un UNION, cela peut être plus lent car il doit appliquer un DISTINCT, mais UNION ALL n'a pas à le faire, donc cela ne devrait pas être différent.
Mise à jour :
Consultez les plans d'exécution et comparez-les - voyez s'il y a une différence. Vous pouvez afficher le plan d'exécution en cliquant sur le bouton "Inclure le plan d'exécution réel" dans SSMS avant d'exécuter la requête
Mise à jour 2 :
Sur la base des CTE complets donnés, je pense que je chercherais à les optimiser - je ne pense pas que l'UNION ALL soit réellement le problème.
À mon humble avis, la meilleure chose à faire est de parcourir les CTE un par un et d'essayer d'optimiser chacun individuellement afin que, lorsque vous les combinez tous dans la requête principale, ils fonctionnent mieux.
par exemple. pour tDictionaryStreets, que diriez-vous d'essayer ceci :
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 sur chaque table doit au moins avoir un index. Essayez de retravailler tDictionarySubCities de la même manière avec des jointures également.