【问题标题】:Using NULL with spatial indexes将 NULL 与空间索引一起使用
【发布时间】:2013-02-21 14:33:10
【问题描述】:

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

我还为此地理信息创建了空间索引。

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

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

  • 如果我将 NULL 分配给不在地图上的所有照片的地理位置,则此类查询的性能太慢(正如我所不理解的,空间索引根本不适用于 NULL 列)。

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

我该如何克服这些问题?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我通过使用单独的表来存储空间数据类型解决了这个问题。 在我的项目中,我有一个带有 Id 列、纬度和经度列的地址表 然后我有一个 AddressCoordinate 表,它对 Address 的 Id 和一个 Geography 列有一个外键约束。 最后,我有一个脚本可以每天填充缺失的有效地址坐标。

    【讨论】:

    • 我同意这不是一个理想的解决方案,但它确实有它的好处: 1:没有插入需要稍后过滤掉的虚拟数据。 2:大小和性能:虚拟数据也会显着增加索引大小,从而影响执行时间。 3:我只有空间数据类型存储在那个表上,所以唯一的重复是PK。这种权衡让我觉得值得,但我知道你对你的案子得出了不同的结论。
    【解决方案2】:

    据我了解,我的问题有两种解决方案:

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

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 2023-03-19
      • 2023-03-04
      相关资源
      最近更新 更多