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 查询缓慢

SQL Server 2008 地理空间查询

sql server 2008空间释放

SP 执行时 SQL Server 2008 中的 QUOTED IDENTIFIER 错误

SQL Server 2008 R2 的可重试 SQLBulkCopy

如何正确索引具有 2500 万行的 SQL Server 表