对空间索引使用NULL

时间:2013-02-21 14:33:11

标签: sql sql-server null geospatial spatial-index

我在SQL Server数据库中有大量照片(约10百万),地理坐标列可以是NULL或NOT NULL(未放置或放置在地图上)。

我还在此地理信息上创建了一个空间索引。

现在我正在尝试选择某个多边形内的所有照片。

有两种方法可以存储不在地图上的照片:

  • 如果我将NULL分配给地图上没有的所有照片的地理位置,那么这种查询的执行速度太慢(因为我不知道,空间索引根本不适用于NULL列。)

  • 如果我将POINT(0 0)分配给地图上没有的所有照片的地理位置,则性能良好,除了此零点POINT(0 0)的情况。此类请求也会返回错误的照片(地图上不存在这些照片)。

我如何克服这些问题?

我应该添加包含NULL或NOT NULL位的列,并从两列创建索引(此列和地理信息)?

UPDATE 我尝试从两列创建索引,但这是不可能的,因为空间索引只包含一个包含地理信息的列(MSDN)。

2 个答案:

答案 0 :(得分:2)

您使用的是哪个版本的SQL服务器? 2008和2008 R2中存在可空空间列的已知问题 请查看我对同一主题的问题:SQL Server 2008 Performance on nullable geography column with spatial index

我通过使用单独的表来存储空间数据类型来解决此问题。 在我的项目中,我有一个带有Id列,纬度和经度列的地址表 然后我有一个AddressCoordinate表,它具有地址Id的外键约束和Geography列。 最后,我有一个脚本来填充缺少有效的AddressCoordinates。

答案 1 :(得分:0)

据我所知,我的问题有两个解决方案:

  • 将零点POINT(0 0)移动到远北点POINT(0 90)。此解决方案并不理想,但工作且不需要更改SQL Server版本。
  • 通过执行以下脚本,将SQL Server版本更改为110(在此版本的bug中修复了NULL): ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 110