【发布时间】:2012-03-14 18:54:52
【问题描述】:
背景
我有一个表,其中包含代表客户区域的 POLYGONS/MULTIPOLYGONS:
- 该表包含大约 8,000 行
- 大约 90% 的多边形是圆形
- 其余的多边形代表一个或多个州、省或其他地理区域。这些形状的原始多边形数据是从US census data 导入的。
- 该表在主键上有一个空间索引和一个聚集索引。未对默认 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)) 没有任何效果,从执行计划中可以清楚地看出,无论提示如何,它都在引用我的索引。
减少多边形
从美国人口普查数据导入的领土多边形似乎过于复杂,因此我创建了第二列,并测试了具有不同程度公差的缩减多边形(w/Reduce() method)。对新列运行与上述相同的查询会产生以下结果:
- 不减少:12649ms
- 减少了 10:7194 毫秒
- 减少了 20:6077 毫秒
- 减少了 30:4793 毫秒
- 减少了 40:4397 毫秒
- 减少 50:4290ms
显然朝着正确的方向前进,但降低精度似乎是一个不雅的解决方案。这不是索引应该用于的吗?对于这样一个基本查询,执行计划似乎仍然异常复杂。
空间索引
出于好奇,我去掉了空间索引,结果惊呆了:
- 在没有索引的情况下查询速度更快(低于 3 秒,无缩减,低于 1 秒,缩减容差 >= 30)
- 执行计划看起来非常简单:
我的问题
- 为什么我的空间索引会减慢速度?
- 为了加快查询速度真的有必要降低多边形复杂性吗?降低精度可能会导致问题出现,而且似乎不会很好地扩展。
其他说明
- 已应用 SQL Server 2008 R2 Service Pack 1
- Further research suggested 在存储过程中运行查询。试过了,似乎没有任何改变。
【问题讨论】:
标签: sql-server-2008-r2 spatial-index sqlgeography