【发布时间】:2010-02-05 08:52:29
【问题描述】:
我有一个以 CTE 结尾的长链的查询
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryStreets
UNION ALL
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryRegions
这个查询的执行时间是 1450 毫秒。当我分别执行这两个 SELECT 时,需要的时间要少得多。对于查询
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryStreets
执行时间为 106 毫秒。而对于查询
SELECT RegionName, AreaName, CityName, SubCityName, StreetName
FROM tDictionaryRegions
20 毫秒。
为什么 UNION ALL 将执行时间增加了 10 倍以上?我该怎么做才能减少它?
感谢您的帮助。
更新 整个查询(我缩短了它,但问题仍然存在)是
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
【问题讨论】:
-
如果重复运行相同的查询,这些执行时间会改变吗?
-
是的,但不是很明显。无论如何差异大约是 10 倍
-
根据您提供的额外信息,请参阅我的回答中的更新 2
标签: sql sql-server-2005 performance union