空间索引减慢了查询速度

Dav*_*iac 6 sql-server-2008-r2 spatial-index sqlgeography

背景

我有一个表格包含代表客户区域的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
Run Code Online (Sandbox Code Playgroud)

看起来像一个简单,直接的查询需要12或13秒才能执行,对于这样一个简单的查询来说,这似乎是一个非常复杂的执行计划.

执行计划

在我的研究中,有几个消息来源建议在查询中添加索引提示,以确保查询优化器正确使用空间索引.添加WITH(INDEX(idx_terr_territory))没有任何效果,并且从执行计划中可以清楚地看出,无论提示如何,它都引用了我的索引.

减少多边形

从美国人口普查数据导入的领土多边形似乎有可能是不必要的复杂,因此我创建了第二列,并测试了具有不同程度公差的缩小多边形(带有Reduce()方法).对新列运行与上面相同的查询会产生以下结果:

  • 没有减少:12649ms
  • 减少10:7194ms
  • 减少20:6077ms
  • 减少30:4793ms
  • 减少40:4397ms
  • 减少50:4290ms

显然朝着正确的方向前进,但精确度下降似乎是一个不优雅的解决方案.这不是索引应该是什么?对于这样的基本查询,执行计划似乎仍然很复杂.

空间索引

出于好奇,我删除了空间索引,并被结果震惊:

  1. 没有索引时查询速度更快(sub 3 sec w/no reduction,sub 1 sec with reduction tolerance> = 30)
  2. 执行计划看起来很远,更简单:

执行计划没有索引

我的问题

  1. 为什么我的空间索引减慢了速度?
  2. 为了加快查询速度,减少多边形复杂度真的很有必要吗?降低精度可能会导致问题,并且似乎不会很好地扩展.

其他说明

  • 已应用SQL Server 2008 R2 Service Pack 1
  • 进一步的研究建议在存储过程中运行查询.试过这个,似乎没有任何改变.

Seb*_*ine 0

这可能只是由于并行执行的更简单的执行计划所致,而另一个则不然。然而,第一个执行计划有一个可能值得研究的警告。