【发布时间】:2012-05-29 00:55:11
【问题描述】:
我有一个大型查询,它试图将质心与它们适合的多边形进行匹配。虽然我确实限制了块和多边形的 Z 值,但它仍然会进行 很多 多点计算,并且需要 很长 时间来运行。 p>
对于一些背景:
- 包含质心的表有 250 万行
- 表中的所有空间数据都在世界上很小的区域,整个事物的边界框只有 7643 x 2351 米
- 在这些行中,660K 符合 Z 标准
- 包含多边形的表有 10K 行
- 表中的所有空间数据都位于世界上更小的区域
- 在这些行中,有 2366 行符合名称条件
- 在没有任何索引的情况下运行查询需要 11 小时并返回 91K 匹配项
查询是这样的:
select blocks.Id, blocks.WGS84Centroid, polygons.Shape
from
blocks inner join polygons
on
blocks.ZCentre >= (polygons.ZCentre - (polygons.ZLength/2)) and blocks.ZCentre <= (polygons.ZCentre + (polygons.ZLength/2)) and
polygons.Shape.STIntersects(blocks.WGS84Centroid) = 1
inner join name
on
polygons.nameId = name.ID
where name.Name = 'blah'
因此,为了加快查询速度,我在blocks.WGS84Centroid 上添加了一个空间索引,在polygons.Shape 上添加了一个空间索引。
查询分析器还建议在 blocks.ZCentre 上建立非聚集索引,包括 blocks.Id 和 blocks.WGS84Centroid。
毕竟,这是查询计划:
以及过滤成本:
但是,在添加这 3 个索引后,查询仍然需要同样长的时间才能运行。
我现在能做什么?
【问题讨论】:
-
@DavidBrabant:索引是新创建的;我怀疑这会有所帮助。
-
实际上,当我使用 WITH(INDEX(CentroidSpatialIndex)) 尝试提示查询分析器时,我可以看到聚集索引搜索上面有一个 /!\ 图标。我试图运行 CREATE STATISTICS,但我收到错误 Column 'WGS84Centroid' in table 'dbo.blocks' is of an type that is invalid for used as a key column in index or statistics.
标签: sql-server-2008 tsql geospatial spatial-index