相关疑难解决方法(0)

选择具有大多边形的良好SQL Server 2008空间索引

我正在尝试为我正在处理的数据集选择一个不错的SQL Server 2008空间索引设置.

数据集是多边形,表示整个地球的轮廓.表中有106,000行,多边形存储在几何字段中.

我的问题是许多多边形覆盖了地球的很大一部分.这似乎很难获得一个空间索引,它将消除主过滤器中的许多行.例如,查看以下查询:

SELECT "ID","CODE","geom".STAsBinary() as "geom" FROM "dbo"."ContA"
WHERE "geom".Filter(
  geometry::STGeomFromText('POLYGON ((-142.03193662573682 59.53396984952896,
    -142.03193662573682 59.88928136451884,
    -141.32743833481925 59.88928136451884,
    -141.32743833481925 59.53396984952896,
    -142.03193662573682 59.53396984952896))', 4326)
) = 1
Run Code Online (Sandbox Code Playgroud)

这是查询与表中只有两个多边形相交的区域.无论我选择何种空间索引设置组合,Filter()总是返回大约60,000行.

用STIntersects()替换Filter()当然只返回我想要的两个多边形,但当然需要更长的时间(Filter()为6秒,STIntersects()为12秒).

任何人都可以给我任何关于是否存在可能在60,000行上改进的空间索引设置或者我的数据集是否与SQL Server的空间索引不匹配的提示?

更多信息:

正如所建议的那样,我在地球上使用4x4网格分割多边形.我无法用QGIS看到这样的方法,所以我编写了自己的查询来做到这一点.首先我定义了16个边界框,第一个看起来像这样:

declare  @box1 geometry = geometry::STGeomFromText('POLYGON ((
-180 90,
-90 90,
-90 45,
-180 45,
-180 90))', 4326)
Run Code Online (Sandbox Code Playgroud)

然后我使用每个边界框来选择和截断与该框相交的多边形:

insert ContASplit
select CODE, geom.STIntersection(@box1), CODE_DESC from ContA
where geom.STIntersects(@box1) = 1
Run Code Online (Sandbox Code Playgroud)

我显然为4x4网格中的所有16个边界框做了这个.最终结果是我有一个新表~107,000行(这证实我实际上没有很多巨大的多边形).

我添加了一个空间索引,每个对象有1024个单元格,每个级别的单元格低,低,低,低.

然而,非常奇怪的是,这个具有分割多边形的新表仍然与旧表一样.执行上面列出的.Filter 仍然会返回~60,000行.我根本不理解这一点,显然我不明白空间索引实际上是如何工作的.

矛盾的是,虽然.Filter()仍然返回~60,000行,但它的性能有所提高..Filter()现在大约需要2秒而不是6秒,而.STIntersects()现在需要6秒而不是12秒.

这里要求的是索引的SQL示例:

CREATE SPATIAL INDEX [contasplit_sidx] ON [dbo].[ContASplit] 
(
    [geom]
)USING …
Run Code Online (Sandbox Code Playgroud)

spatial geospatial spatial-query sql-server-2008 spatial-index

12
推荐指数
2
解决办法
1万
查看次数

从地理列中搜索附近的点

我的表中有一个带有空间索引的地理类型列.如何在使用索引来提高性能的同时选择在给定纬度/经度的X米范围内的前N行?

sql geolocation sql-server-2008-r2 sqlgeography

3
推荐指数
1
解决办法
3853
查看次数