我在这里无法理解我的查询结果:http: //pastebin.com/sGVnq1jU。
它按预期工作,但是每当 CTE 表达式的T2.CityId IN (...)
子句Clusters
达到超过 6 个要匹配的值时,执行计划就会更改为包括昂贵的表扫描,并且查询会变得非常慢。
关于为什么会这样的任何想法?
我在这里无法理解我的查询结果:http: //pastebin.com/sGVnq1jU。
它按预期工作,但是每当 CTE 表达式的T2.CityId IN (...)
子句Clusters
达到超过 6 个要匹配的值时,执行计划就会更改为包括昂贵的表扫描,并且查询会变得非常慢。
关于为什么会这样的任何想法?
尝试避免使用 IN 子句,而是使用 IN 子句中的参数值构造另一个 CTE 表(如下)
此外,请确保您在 map.ClusterDist.CityId 列上有一个索引。
DECLARE @cityIds0 int, @cityIds1 int, @cityIds2 int, @cityIds3 int, @cityIds4 int, @cityIds5 int, @cityIds6 int, @cityIds7 int
SELECT @cityIds0 = 0, @cityIds1 = 1, @cityIds2 = 2, @cityIds3 = 3, @cityIds4 = 4, @cityIds5 = 5, @cityIds6 = 6, @cityIds7 = 7
;WITH Cities AS
(
SELECT @cityIds0 as [CityId]
UNION ALL SELECT @cityIds1
UNION ALL SELECT @cityIds2
UNION ALL SELECT @cityIds3
UNION ALL SELECT @cityIds4
UNION ALL SELECT @cityIds5
UNION ALL SELECT @cityIds6
UNION ALL SELECT @cityIds7
), Clusters AS
(
SELECT T1.*
,T2.CityId
FROM map.Cluster T1
JOIN map.ClusterDist T2
ON T2.Id = T1.DistId
JOIN Cities C
ON C.CityId = T2.CityId
AND T2.Zoom = @zoom
) -- etc...
SELECT * FROM Clusters
如果这不能满足您的性能需求,那么可能是时候将您的一些 CTE 表换成您可以为这种特定场景建立索引的旧临时表了。