I have a query with a long CTE chain that ends in
SELECT RegionName, AreaName, CityName, SubCityName, StreetName FROM tDictionaryStreets UNION ALL SELECT RegionName, AreaName, CityName, SubCityName, StreetName FROM tDictionaryRegions
The execution time of this request is 1450 ms. When I execute these 2 SELECTs, it takes much less time. For request
SELECT RegionName, AreaName, CityName, SubCityName, StreetName FROM tDictionaryStreets
the runtime is 106 ms. And for the request
SELECT RegionName, AreaName, CityName, SubCityName, StreetName FROM tDictionaryRegions
it's 20 ms.
Why does UNION ALL increase execution time by more than 10 times? What can I do to reduce it?
Thank you for your help.
UPDATED Entire request (I abbreviated it, but the problem is still present)
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