我在SQL Server 2008上看到一些奇怪的性能问题,其中包含具有空间索引的可为空的地理位置列。每个空值都存储为空间索引内的根节点。
例如,一个表中有5000000个地址,其中存储了4000000个坐标。
每次查询索引时,我都必须扫描每个根节点,这意味着我必须扫描1 000 001级0节点。(所有有效坐标的1个根节点+ 1M空值)
我找不到文档中提到的内容,也看不到为什么如果索引无法处理,SQL为何允许此列为空。
现在,我仅通过将现有坐标存储在单独的表中来绕过此操作,但是我想知道这里的最佳实践是什么?
编辑:(案例关闭)
我在sql空间msdn论坛上获得了一些帮助,并且有一个有关此问题的博客文章:http :
//www.sqlskills.com/BLOGS/BOBB/post/Be-careful-with-EMPTYNULL -values-and-
spatial-indexes.aspx
MSDN文档也确实提到了这一点,但是以一种非常偷偷摸摸的方式。
NULL和空实例的计数为0级,但不会影响性能。级别0将具有与NULL一样多的单元格,并且在基表处具有空实例。对于 地理
索引,级别0将具有与NULL一样多的单元格,而空实例则具有+1单元格,因为查询样本被计为1
文本中没有任何地方保证null不会影响地理性能。假定只有几何形状不受影响。
只是后续说明-此问题已在Sql Server Denali中使用新的AUTO_GRID索引(现在为默认索引)修复。NULL值将不再在根索引节点中填充。
问题内容: 我在可为空的列上有一个索引,我想选择所有它的值,如下所示: 在说明计划中,我看到了一个提示(即使提示也无济于事) 确实使用索引… 我用谷歌搜索发现索引中没有空条目,因此第一个查询不能使用索引。 我的问题很简单: 为什么索引中没有空条目? 问题答案: 默认情况下,关系数据库会忽略NULL值(因为关系模型说NULL表示“不存在”)。因此,索引不存储NULL值,因此,如果您在SQL语句中具有
问题内容: 有谁知道地理空间索引的工作原理,我的意思是计算最近点的算法? 在SQL中,我们可能会执行以下操作: 与mongodb的地理空间索引相比,这肯定不够高效,但是mongodb如何计算和排序? 提前谢谢了。 问题答案: mongodb地理空间的核心是Geohashes。Geohash是一个 分层的空间数据结构,将空间细分为网格状的存储桶。 我在mongo中找不到适合geohash实现的链接,
问题内容: 我似乎找不到太多的文档。在支持这种查询的PostgreSQL上创建数据库/表的最简单方法是什么?SELECT * FROM table WHERE distance(POINT(0,0),table.location)<= 1000m; 其中POINT(0,0)和table.location应该是经度/纬度对,并且1000m是1000米。我应该如何索引该表?谢谢。 问题答案: Post
我想根据geo_point的距离查询带有偏置的文档,目前我使用的geo_distance过滤器过滤所有距离较大的文档,但我想要某种偏置。 例如,如果我要查询10个文档,而只有6个文档位于geo_距离过滤器内,则还返回4个距离较大的文档。 我该怎么做?
问题内容: 这是具有3列(ID,UNIQUE_VALUE,UNIQUE_GROUP_ID)的示例表 我希望下面的记录可以被允许: 或者 或( 注:这种情况是不允许的,也不) 并且这些是不允许的: 我在最后2列上创建了唯一索引,但是仅允许前2个示例。 仅当两者都不为null时,才可以让db检查这两列的唯一性吗? 问题答案: 您只想对和都不为空的行实施唯一性。为此,您可以使用基于函数的唯一索引:
我有一个清单 问题是,对于一个Person来说,只有一个字段(除了name之外)是实际启动的(例如non-null),其他的字段都是null,所以对于其中的4个值,有4个Person实例,每个实例都有一个name和一个值。我如何将这个Person对象列表转换为value对象列表,最好使用StreamAPI?