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

时间:2010-05-27 12:14:43

标签: sql-server-2008 geospatial spatial spatial-query spatial-index

3 个答案:

答案 0 :(得分:12)

在索引查询中,您使用:

CREATE SPATIAL INDEX [contasplit_sidx] ON [dbo].[ContASplit] 
(
    [geom]
)USING  GEOMETRY_GRID 
WITH (
BOUNDING_BOX =(-90, -180, 90, 180),
...

BOUNDING_BOX因此映射到:

xmin = -90
ymin = -180
xmax = 90
ymax = 180
  • Longtitude(-180 to 180 - 指定东西方 Meridian)应映射到X
  • 纬度(-90到90 - 指定方式 远在赤道北部或南部) 应映射到Y

因此,要为世界创建BOUNDING_BOX,您应该使用:

CREATE SPATIAL INDEX [contasplit_sidx] ON [dbo].[ContASplit] 
(
    [geom]
)USING  GEOMETRY_GRID 
WITH (
BOUNDING_BOX =(-180, -90, 180, 90),
...

这应创建一个适合您数据的索引,这意味着索引将涵盖您的所有功能。

答案 1 :(得分:5)

拆分数据

如果查询用于显示数据,则可以使用网格拆分大型多边形。然后可以使用索引快速检索这些内容。您可以删除轮廓,以便功能看起来仍然是连续的。

大多数商业GIS软件包都有工具将一个多边形数据集拆分成另一个。搜索执行交叉的工具。

如果您正在使用OpenSource,那么请查看QGIS和http://www.ftools.ca哪些“执行地理处理操作,包括交叉点,差异,联合,溶解和裁剪。”

请查看:http://postgis.refractions.net/docs/ch04.html#id2790790了解大型功能为何不好。

过滤和交叉

此处的Filter子句还有更多内容 - http://blogs.msdn.com/b/isaac/archive/2010/03/04/filter-one-odd-duck.aspx

空间索引

要检查的其他内容是空间索引实际上正在查询计划中使用。您可能必须强制查询使用带有WITH子句的索引:

http://blogs.msdn.com/b/isaac/archive/2008/08/29/is-my-spatial-index-being-used.aspx

以下索引的更多详情:

http://blogs.msdn.com/b/isaac/archive/2009/05/28/sql-server-spatial-indexing.aspx

还可以尝试为您的数据运行 sp_help_spatial_geometry_index ,以查看用于空间索引的设置

http://msdn.microsoft.com/en-us/library/cc627426.aspx

使用某些测试几何体运行此SP会生成各种统计信息,以尝试根据您的数据定制索引。完整的属性列表位于http://msdn.microsoft.com/en-us/library/cc627425.aspx

这些包括以下值:

  • CellArea_To_BoundingBoxArea_Percentage_In_Level1
  • Number_Of_Rows_Selected_By_Primary_Filter

搞砸了几何

从sp_help_spatial_geometry_index的结果看,您可能会遇到几何体本身而不是空间索引的问题。

Base_Table_Rows计数似乎是一个错误 - http://connect.microsoft.com/SQLServer/feedback/details/475838/number-of-rows-in-base-table-incorrect-in-sp-help-spatial-geography-index-xml 可能值得重新创建表/数据库并从头开始尝试索引。

Total_Number_Of_ObjectCells_In_Level0_In_Index 60956是在级别0返回的许多功能。很可能它们要么在空间索引范围之外,要么为空。然后它在所有这些功能上运行Intersect(Number_Of_Times_Secondary_Filter_Is_Called 60956),这可以解释为什么它很慢。尽管文档声称没有对null功能的性能影响 - 我相信它仍然需要查找记录,即使没有执行交叉。

  

计算NULL和空实例   在0级但不会影响   性能。 0级将拥有尽可能多的   cell为NULL,空实例为   基表。

我认为Primary_Filter_Efficiency为0.003281055表示效率为0.03%!

要尝试的一些事项:

  1. SELECT * FROM sys.spatial_indexes?
  2. 有什么奇怪的
  3. MakeValid声明:

    更新MyTable SET GeomFieldName = GeomFieldName.MakeValid()

  4. 重置/仔细检查SRID:

    更新MyTable SET GeomFieldName.STSrid = 4326

  5. 添加一些字段以显示功能的范围。这可能会突出显示问题/ NULL几何。

    ALTER TABLE MyTable ADD MinX AS(CONVERT(int,GeomFieldName.STEnvelope()。STPointN((1))。STX,0))PERSISTED ALTER TABLE MyTable 添加最小AS(CONVERT(int,GeomFieldName.STEnvelope()。STPointN((1))。STY,0))PERSISTED ALTER TABLE MyTable ADD MaxX AS(CONVERT(int,GeomFieldName.STEnvelope()。STPointN((3))。STX,0))PERSISTED ALTER TABLE MyTable ADD MaxY AS(CONVERT(int,GeomFieldName.STEnvelope()。STPointN((3))。STY,0))PERSISTED

答案 2 :(得分:0)

我也发现很难“GUESS”对于特定的几何图表,适当的空间索引是什么。我尝试使用sp_help_spatial_geometry_index存储过程进行更多有根据的猜测。所有这一切都告诉我,每个“GUESS”之后我的空间索引的表现有多糟糕。即使我仅通过考虑2-8 CELLS_PER_OBJECT来限制我的选项,单独给出567个排列(选择3种类型4次= 81.然后乘以7个CELLS_PER_OBJECT选项)。我决定让SQL服务器为我做实验并给我一些经验证据。我创建了一个存储过程,它将遍历排列并在每个空间表上重建空间索引。然后,它将使用两个提供的几何实例测试空间索引的每个排列的查询性能。我选择了一个包含整个数据集的几何实例,然后选择了包含较小部分数据集的另一个实例。 proc在每个实例上使用STIntersect()4次,然后将结果记录在表中。然后,您可以查询结果表以找出在特定数据集上最佳执行的空间索引。试一试,如果您有任何建议的改进或观察,请告诉我。

使用此https://gist.github.com/anonymous/5322650创建过程。然后使用此示例设置执行语句:

/* set up some strings to be used to create geometry instances when our test spatial queries run */ 
DECLARE @ada VARCHAR(MAX) 
SET @ada = 'GEOMETRY::STGeomFromText(''POLYGON ((2422068 527322, 2422068 781170, 2565405 781170, 2565405 527322, 2422068 527322))'', 0)'
DECLARE @mer VARCHAR(MAX) 
SET @mer = 'GEOMETRY::STGeomFromText(''POLYGON ((2451235 696087, 2451235 721632, 2473697 721632, 2473697 696087, 2451235 696087))'', 0)'
DECLARE @mer1 VARCHAR(MAX) 
SET @mer1 = 'GEOMETRY::STGeomFromText(''POLYGON ((244386 712283, 2443866 717980, 2454872 717980, 2454872 712283, 244386 712283))'', 0)'
DECLARE @mer2 VARCHAR(MAX) 
SET @mer2 = 'GEOMETRY::STGeomFromText(''POLYGON ((2434259 687278, 2434259 701994, 2449657 701994, 2449657 687278, 2434259 687278))'', 0)'


EXEC gis.sp_tune_spatial_index 'PARCEL_ADA', 'S104_idx', 2, 8, @ada, @mer1 
GO

注意:显然,重建567次空间索引需要很长时间。从命令行开始,或者在执行其他操作时让它运行。如果它是您经常使用的数据集并且几何图形保持相似,那么运行proc会花费时间。结果表以毫秒为单位显示性能。