背景
我有一个表,其中包含代表客户区域的 POLYGONS/MULTIPOLYGONS:
- 该表包含大约 8,000 行
- 大约 90% 的多边形是圆形
- 其余的多边形代表一个或多个州、省或其他地理区域。这些形状的原始多边形数据是从美国人口普查数据中导入的。
- 该表在主键上有一个空间索引和一个聚集索引。未对默认 SQL Server 2008 R2 设置进行任何更改。每个对象 16 个单元格,所有级别中等。
这是一个简化的查询,它将重现我遇到的问题:
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))
没有任何效果,从执行计划中可以清楚地看出,无论提示如何,它都在引用我的索引。
减少多边形
从美国人口普查数据导入的领土多边形似乎过于复杂,因此我创建了第二列,并测试了具有不同程度公差的缩减多边形(使用Reduce() 方法)。对新列运行与上述相同的查询会产生以下结果:
- 不减少:12649ms
- 减少10:7194ms
- 减少20:6077ms
- 减少 30:4793ms
- 减少 40:4397ms
- 减少50:4290ms
显然朝着正确的方向前进,但降低精度似乎是一个不雅的解决方案。这不是索引应该用于的吗?对于这样一个基本查询,执行计划似乎仍然异常复杂。
空间索引
出于好奇,我去掉了空间索引,结果惊呆了:
- 在没有索引的情况下查询更快(低于 3 秒,不减少,低于 1 秒,减少容差 >= 30)
- 执行计划看起来要简单得多:
我的问题
- 为什么我的空间索引会减慢速度?
- 为了加快查询速度,真的有必要降低我的多边形复杂性吗?降低精度可能会导致问题出现,并且似乎不会很好地扩展。
其他注意事项
- 已应用 SQL Server 2008 R2 Service Pack 1
- 进一步的研究建议在存储过程中运行查询。试过这个,似乎没有任何改变。