SQL Server 2008 在具有空间索引的可空地理列上的性能
Posted
技术标签:
【中文标题】SQL Server 2008 在具有空间索引的可空地理列上的性能【英文标题】:SQL Server 2008 Performance on nullable geography column with spatial index 【发布时间】:2011-02-10 08:32:33 【问题描述】:我在 SQL Server 2008 上看到一些奇怪的性能问题,其中包含一个可以为空的地理列和一个空间索引。每个空值都存储为空间索引中的根节点。
例如一个包含 5 000 000 个地址的表,其中 4 000 000 个存储了坐标。 每次查询索引时,我都必须扫描每个根节点,这意味着我必须扫描 1 000 001 级 0 节点。 (所有有效坐标的 1 个根节点 + 1M 个空值)
我找不到文档中提到的这一点,我也看不出为什么如果索引无法处理 SQL 允许该列可以为空。
目前我已经通过仅将现有坐标存储在单独的表中来绕过这一点,但我想知道这里的最佳做法是什么?
编辑:(案件结案) 我在 sql spatial msdn 论坛上得到了一些帮助,并且有一篇关于这个问题的博文: http://www.sqlskills.com/BLOGS/BOBB/post/Be-careful-with-EMPTYNULL-values-and-spatial-indexes.aspx MSDN 文档也确实提到了这一点,但以一种非常偷偷摸摸的方式。
NULL 和空实例被计算在内 处于 0 级,但不会影响 表现。 0级将有尽可能多的 单元格为 NULL 和空实例 基表。对于 geography 索引, 级别 0 将有尽可能多的单元格 NULL 和空实例 +1 个单元格, 因为查询样本被计为 1
文本中没有任何地方承诺空值不会影响地理性能。 只有几何体应该不受影响。
【问题讨论】:
【参考方案1】:只是一个后续说明 - 此问题已在 Sql Server Denali 中通过新的 AUTO_GRID 索引(现在是默认索引)得到修复。 NULL 值将不再填充在根索引节点中。
【讨论】:
以上是关于SQL Server 2008 在具有空间索引的可空地理列上的性能的主要内容,如果未能解决你的问题,请参考以下文章
NewRelic 在具有适当索引的表之一上报告的 SQL Server 2008 查询缓慢
SP 执行时 SQL Server 2008 中的 QUOTED IDENTIFIER 错误