【发布时间】: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