我有一张包含代表客户区域的POLYGONS / MULTIPOLYGONS的表格:
这是一个简化的查询,它将重现我遇到的问题:
DECLARE @point GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT (-76.992188 39.639538)', 4326)
SELECT terr_offc_id
FROM tbl_office_territories
WHERE terr_territory.STIntersects(@point) = 1
看起来像一个简单,直接的查询需要12或13秒才能执行,对于这样一个简单的查询来说,这似乎是一个非常复杂的执行计划。
在我的研究中,有几个消息来源建议在查询中添加索引提示,以确保查询优化器正确使用空间索引。添加WITH(INDEX(idx_terr_territory))
没有任何效果,并且从执行计划中可以清楚地看出,无论提示如何,它都会引用我的索引。
从美国人口普查数据导入的区域多边形似乎可能不必要地复杂,因此我创建了第二列,并测试了具有不同程度容差的缩小多边形(w / Reduce() method)。对新列运行与上面相同的查询会产生以下结果:
显然朝着正确的方向前进,但精确度下降似乎是一个不优雅的解决方案。这不是索引应该是什么?对于这样的基本查询,执行计划似乎仍然很复杂。
出于好奇,我删除了空间索引,并被结果震惊了:
答案 0 :(得分:1)
我的第一个想法是检查索引的边界坐标;看看它们是否覆盖了整个几何形状。其次,根据我的经验,在默认的16MMMM下留下的空间索引表现非常糟糕。我不确定为什么这是默认值。我在this answer上写了一些关于空间索引调整的内容。
首先确保索引涵盖所有几何。然后尝试将每个对象的单元格减少到8.如果这两个东西都没有提供任何改进,那么在我上面链接的答案中运行空间索引调整过程可能是值得的。
最后的想法是,状态边界有很多顶点并且有许多状态边界多边形,你正在测试这些多边形,它很可能需要很长时间才能减少它们。
哦,从SQL Server 2012开始已经有两年了,现在有一个GEOMETRY_AUTO_GRID tessellation可以为你做索引调整,并且在大多数情况下做得很好。
答案 1 :(得分:0)
这可能仅仅是因为并行执行的更简单的执行计划,而另一个则不是。但是,第一个执行计划有一个可能值得调查的警告。