如何在SQL Server 2008查询中指定此SQL索引提示?

时间:2010-11-15 01:42:58

标签: sql sql-server-2008 indexing spatial spatial-index

我不确定在我的查询中指定此SQL Spatial索引提示的位置和方式: -

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

当我运行查询时,它不使用Spatial Hint。是的,我使用的是最新版本的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。 Filter(where子句)占据了第二大成本。

alt text

2 个答案:

答案 0 :(得分:0)

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

相反,您要做的是详细检查索引和查询执行计划,遵循执行计划的每个节点(尤其是具有较高相对成本的节点),看看您是否可以执行SQL Server希望您执行的操作为了获取你的MySpatialIndex索引而不强迫它这样做。通常情况下,它只是一个索引中缺少的字段,它将导致执行计划按照您的意愿运行...没有强制必要。

答案 1 :(得分:0)

为什么您认为问题出在ON条款中?您正在使用WHERE部分中应用于b表的功能 - 这就是为什么您在a表上有 fullscan ,并且部分扫描{ {1}}表。