【问题标题】:SqlServer spatial index/filteringSqlServer 空间索引/过滤
【发布时间】:2017-04-12 13:58:01
【问题描述】:

我有一个有趣的问题。我有一个由 GeoServer 在非规范化表上生成的选择语句。查询的结构是这样的

选择“the_geom”.STAsBinary() 作为“the_geom”
从表
where [一堆ands和ors条件]

"the_geom".Filter(geometry::STGeomFromText('') = 1;

这个问题大约需要 6 分钟。如果我跳过空间条件,这个问题大约需要 1 秒。数据库大约 40GB,SQL Server 2014,26GB RAM。我有非空间部分的空间索引和其他索引。空间索引的网格大小约为 600。

所以我的问题是,是否有什么方法可以让这个问题变得更快?我可以在 SQL Server 中做任何 tweeks 吗?

【问题讨论】:

  • 您确定这是正在发送的查询吗? STGeomFromText() 看起来有两个参数。 geoserver 真的会向该调用发送一个空字符串吗?您可能想要摆弄索引中的值以控制每个对象的网格级别和单元格。您可以发布空间索引的 DDL 吗?
  • ddl: 在 [dbo].[tabler] ([GEOM] ) 上创建空间索引 [idx_name] 使用 GEOMETRY_GRID WITH (BOUNDING_BOX =(380656, 6836190, 905384, 7533950), GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), CELLS_PER_OBJECT = 900, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY ] GO Jason,你是对的,STGeomFromText 有两个参数,我留下的 EPSG 代码是 3006。主要问题是网格太大。我将组装一些指标
  • 如果你指的是边界框,也许它太大了——但我通常调整的项目是你所显示的 GRID= 部分中的不同级别以及每个单元格我之前提到的对象。特别是,对于我通常看到的工作负载,每个对象的单元格看起来很高。这两个链接对它们控制的内容提供了相当简洁的解释,并且正如人们所预料的那样,滑动这些值会导致时间/空间权衡。 simple-talk.com/sql/t-sql-programming/…boomphisto.blogspot.com/2011/04/…
  • 是的,问题是 CELLS_PER_OBJECT 值太高。我将返回此案例的指标和解决方法。感谢@JasonKoopmans 的文章。
  • 让我知道你最终选择了什么。写一个引起人们注意索引的那部分的答案是否有意义?我可以将 cmets 总结为答案。

标签: sql-server geoserver sqlgeometry


【解决方案1】:

问题是空间索引不包含任何列或由其他列查找。因此,如果您的条件 the_geom".Filter(geometry::STGeomFromText('') = 1 返回许多行,性能可能会很差。

在我的实践中 sql server 总是使用空间索引,如果你想使用另一个索引,你需要应用提示

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多