4

我不确定在哪里/如何在查询中指定此 SQL 空间索引提示:-

SELECT Whatever
FROM Table1 a
    INNER JOIN Table2 b ON a.Id = b.Id
WHERE @SomeBoundingBox.STIntersects(b.SomeGeographyShape) = 1

当我运行查询时,它没有使用空间提示。是的,我使用的是最新版本的 SQL Server 2008 r2 (v 10.5.1600.1 )。

因此,为了通过强制提示来比较查询速度,我尝试了...

SELECT Whatever
FROM Table1 a
    INNER JOIN Table2 b WITH (INDEX(MySpatialIndex)) ON a.Id = b.Id
WHERE @SomeBoundingBox.STIntersects(b.SomeGeographyShape) = 1

这行得通,但性能确实很差。我想知道它是否试图使用我的提示进行a.Id = b.Id连接(我不想使用提示)。

有什么建议么?

更新:

添加了查询计划。大部分成本是两个表之间的 JOIN。过滤器(where 子句)占据了第二个最昂贵的部分。

替代文字

4

2 回答 2

1

我建议不要强迫提示。SQL Server 选择执行计划是有原因的,正如您所怀疑的,强制执行另一个计划几乎总是会导致性能下降。

相反,您要做的是详细检查您的索引和查询执行计划,跟踪执行计划的每个节点(尤其是相对成本较高的节点),看看您是否可以执行 SQL Server 希望您执行的操作,以便拿起你的 MySpatialIndex 索引,而不是强迫它这样做。通常,它只是索引中的一个缺失字段,它会导致执行计划按您的意愿运行……无需强制。

于 2010-11-15T01:47:49.580 回答
0

为什么你认为问题出在ON条款中?您在WHERE应用于b表格的部分中使用功能 - 这就是您对表格进行全a扫描和对表格进行部分扫描的原因b

于 2010-11-15T01:49:44.763 回答