1

我在这里无法理解我的查询结果:http: //pastebin.com/sGVnq1jU

它按预期工作,但是每当 CTE 表达式的T2.CityId IN (...)子句Clusters达到超过 6 个要匹配的值时,执行计划就会更改为包括昂贵的表扫描,并且查询会变得非常慢。

关于为什么会这样的任何想法?

4

1 回答 1

1

尝试避免使用 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 表换成您可以为这种特定场景建立索引的旧临时表了。

于 2013-07-15T15:58:49.313 回答