我不确定在我的查询中指定此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子句)占据了第二大成本。
答案 0 :(得分:0)
我建议不要强制提示。 SQL Server正在选择执行计划是有原因的,正如您所怀疑的那样,强制执行另一个计划几乎总会导致性能下降。
相反,您要做的是详细检查索引和查询执行计划,遵循执行计划的每个节点(尤其是具有较高相对成本的节点),看看您是否可以执行SQL Server希望您执行的操作为了获取你的MySpatialIndex索引而不强迫它这样做。通常情况下,它只是一个索引中缺少的字段,它将导致执行计划按照您的意愿运行...没有强制必要。
答案 1 :(得分:0)
为什么您认为问题出在ON
条款中?您正在使用WHERE
部分中应用于b
表的功能 - 这就是为什么您在a
表上有 fullscan ,并且部分扫描{ {1}}表。