空间索引减慢查询

Posted

技术标签:

【中文标题】空间索引减慢查询【英文标题】:Spatial index slowing down query 【发布时间】: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 在存储过程中运行查询。试过了,似乎没有任何改变。

【问题讨论】:

【参考方案1】:

我的第一个想法是检查索引的边界坐标;看看它们是否涵盖了您的整个几何图形。其次,根据我的经验,默认 16MMMM 的空间索引性能很差。我不确定为什么这是默认设置。我在this answer上写了一些关于空间索引调优的文章。

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

最后的想法是,州边界有很多顶点,并且有很多州边界多边形,您正在测试它们是否相交,如果不减少它们,很可能需要很长时间。

哦,从 SQL Server 2012 开始已经两年了,现在有一个 GEOMETRY_AUTO_GRID tessellation 可以为您进行索引调整,并且大部分时间都做得很好。

【讨论】:

感谢@GreenGeo。自从我处理这个问题以来已经有一段时间了。最终,我们放弃了,并认为这将在 2012 年修复。但您的回答会有所帮助。我们可能很快会再次尝试使用地理空间的东西。【参考方案2】:

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

【讨论】:

以上是关于空间索引减慢查询的主要内容,如果未能解决你的问题,请参考以下文章

初识Mysql

02: MySQL 索引类型 MySQL 存储引擎

oracle查看索引表空间的使用情况

mongoDb地理空间索引和查询

地理空间索引的划分查询

mysql表结构表空间和索引的查询