我在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值将不再在根索引节点中填充。