【问题标题】:Spatial Indexing in sql serversql server 中的空间索引
【发布时间】:2018-03-16 10:12:54
【问题描述】:

我正在尝试从 postgres 迁移到 sql-server(windows)。但我不知道 ms-sql 语法和文档对我也没有好处。 我有一个表'地理代码'以十进制格式存储纬度和经度数据。 我有一个使用 postgis 索引 lat、long 数据的迁移

create index index_on_geocodes_location ON geocodes using gist (st_geographyfromtext(((('POINT('::text || longitude) || ' '::text) || latitude) || ')'::text))

我很难为 sql-server 生成等效查询。 根据文档,如果列数据类型是地理,这很容易,但由于我已经有一个现有的十进制数据类型的数据库,这将无济于事。

PS:我正在使用 Rails 迁移来执行查询

【问题讨论】:

    标签: sql sql-server spatial-index


    【解决方案1】:

    假设您的用例正在执行空间查询,否则创建空间索引毫无意义。 SQL Server 中的空间索引可以在空间数据类型的列之上创建 - 几何(平面)或地理(曲线)。您可以创建持久计算列并在其上创建索引,如下所示(假设地理数据类型和 SRID 4326):

    create table Geocodes(
    id int identity primary key,
    long decimal,
    lat decimal,
    point as geography::Point(long, lat, 4326) persisted
    )
    
    create spatial index SPIX_Geocodes_Point on Geocodes(point) using geography_auto_grid
    

    【讨论】:

    • 为什么在建表时使用持久化?
    • 空间索引只有在计算列被持久化的情况下才能被创建。
    • 只有需要索引的计算列才需要“persisted”选项,这将使所需的存储需求增加一倍。只需将 lat 和 long 数据直接存储到 geography 数据类型中,就不需要“持久化”。您可以使用“Point.lat”和“Point.long”检索单独的值
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多