Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

UNION ALL Performances dans SQL Server 2005

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.