我有一个大型查询,试图将质心与它们适合的多边形相匹配。虽然我确实通过块和多边形的 Z 值进行约束,但它仍然会进行大量的多点计算并且需要很长时间才能运行。
对于一些背景:
- 包含质心的表有 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 个索引之后,查询仍然需要同样长的时间才能运行。
我现在能做什么?