空间索引减慢了查询速度

时间:2012-03-14 18:54:53

标签: sql-server-2008-r2 spatial-index sqlgeography

背景

我有一张包含代表客户区域的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秒才能执行,对于这样一个简单的查询来说,这似乎是一个非常复杂的执行计划。

Execution Plan

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

减少多边形

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

  • 不减少:12649ms
  • 减少10:7194毫秒
  • 减少20:6077ms
  • 减少30:4793ms
  • 减少40:4397ms
  • 减少50:4290ms

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

空间索引

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

  1. 没有索引时查询速度更快(低于3秒/无减少,低于1秒,减少公差> = 30)
  2. 执行计划看起来更简单,更简单:
  3. Execution Plan w/o index

    我的问题

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

      • 已应用SQL Server 2008 R2 Service Pack 1
      • Further research suggested在存储过程中运行查询。试过这个,似乎没有任何改变。

2 个答案:

答案 0 :(得分:1)

我的第一个想法是检查索引的边界坐标;看看它们是否覆盖了整个几何形状。其次,根据我的经验,在默认的16MMMM下留下的空间索引表现非常糟糕。我不确定为什么这是默认值。我在this answer上写了一些关于空间索引调整的内容。

首先确保索引涵盖所有几何。然后尝试将每个对象的单元格减少到8.如果这两个东西都没有提供任何改进,那么在我上面链接的答案中运行空间索引调整过程可能是值得的。

最后的想法是,状态边界有很多顶点并且有许多状态边界多边形,你正在测试这些多边形,它很可能需要很长时间才能减少它们。

哦,从SQL Server 2012开始已经有两年了,现在有一个GEOMETRY_AUTO_GRID tessellation可以为你做索引调整,并且在大多数情况下做得很好。

答案 1 :(得分:0)

这可能仅仅是因为并行执行的更简单的执行计划,而另一个则不是。但是,第一个执行计划有一个可能值得调查的警告。