我在SQL Server 2008上看到一些奇怪的性能问题,其中包含具有空间索引的可空的地理列。每个空值都存储为空间索引中的根节点。
E.g。一个包含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级将拥有尽可能多的 cell为NULL,空实例为 基表。对于地理索引, 级别0将包含尽可能多的单元格 NULL和空实例+1单元格, 因为查询样本计为 1
在文中没有任何地方承诺空值不会影响地理位置的性能。 只有几何体应该不受影响。
答案 0 :(得分:3)
只是一个后续注释 - 此问题已在Sql Server Denali中修复,并带有新的AUTO_GRID索引(现在是默认值)。将不再在根索引节点中填充NULL值。