J'ai une requête avec une longue chaîne de CTEs qui se termine parUNION ALL performance dans SQL Server 2005
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryStreets
UNION ALL
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryRegions
Le temps d'exécution de cette requête est 1450 ms. Lorsque j'exécute ces 2 SELECT séparément, cela prend beaucoup moins de temps. Pour la requête
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryStreets
le temps d'exécution est de 106 ms. Et pour la requête
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryRegions
c'est 20 ms. Pourquoi UNION ALL augmente le temps d'exécution plus de 10 fois? Que puis-je faire pour le diminuer?
Nous vous remercions de votre aide.
MISE À JOUR La requête tout (j'écourté, mais le problème présente encore) est
WITH tFoundRegions AS
(
SELECT KladrItemName FROM dbo.tBuiltKladrItemsWithQuants
WHERE UserID = @UserID AND (indeces & 1) > 0
),
tFoundAreas AS
(
SELECT KladrItemName FROM dbo.tBuiltKladrItemsWithQuants
WHERE UserID = @UserID AND (indeces & 2) > 0
),
tFoundCities AS
(
SELECT KladrItemName FROM dbo.tBuiltKladrItemsWithQuants
WHERE UserID = @UserID AND (indeces & 4) > 0
),
tFoundSubCities AS
(
SELECT KladrItemName FROM dbo.tBuiltKladrItemsWithQuants
WHERE UserID = @UserID AND (indeces & 8) > 0
),
tFoundStreets AS
(
SELECT KladrItemName FROM dbo.tBuiltKladrItemsWithQuants
WHERE UserID = @UserID AND (indeces & 16) > 0
),
tDictionaryStreets AS
(
SELECT DISTINCT
CASE WHEN RegionName IN (SELECT KladrItemName FROM tFoundRegions) THEN RegionName ELSE NULL END RegionName
, CASE WHEN AreaName IN (SELECT KladrItemName FROM tFoundAreas) THEN AreaName ELSE NULL END AreaName
, CASE WHEN CityName IN (SELECT KladrItemName FROM tFoundCities) THEN CityName ELSE NULL END CityName
, CASE WHEN SubCityName IN (SELECT KladrItemName FROM tFoundSubCities) THEN SubCityName ELSE NULL END SubCityName
, StreetName
FROM StreetNames
WHERE StreetName IN (SELECT KladrItemName FROM tFoundStreets)
),
tMissingSubCities AS
(
SELECT KladrItemName FROM tFoundSubCities
WHERE KladrItemName NOT IN (SELECT SubCityName FROM tDictionaryStreets)
),
tDictionarySubCities AS
(
SELECT DISTINCT
CASE WHEN RegionName IN (SELECT KladrItemName FROM tFoundRegions) THEN RegionName ELSE NULL END RegionName
, CASE WHEN AreaName IN (SELECT KladrItemName FROM tFoundAreas) THEN AreaName ELSE NULL END AreaName
, CASE WHEN CityName IN (SELECT KladrItemName FROM tFoundCities) THEN CityName ELSE NULL END CityName
, SubCityName
, NULL StreetName
FROM SubCityNames
WHERE SubCityName IN (SELECT KladrItemName FROM tMissingSubCities)
)
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryStreets
UNION ALL
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionarySubCities
ces temps d'exécution changent-ils si vous exécutez les mêmes requêtes plusieurs fois? – devio
Oui, mais pas de manière significative. Anyway diffrence est environ 10 fois – StuffHappens
Voir la mise à jour 2 dans ma réponse, basée sur des informations supplémentaires que vous avez donné – AdaTheDev