【问题标题】:SQL Server 2012 nearest neighborSQL Server 2012 最近邻居
【发布时间】:2013-11-06 15:08:51
【问题描述】:

我有一个使用空间数据的非常简单的表结构:

     CREATE TABLE Test
          (
           [ID] int not null,
           [GeoLocation] geometry not null,
     CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
     (
         [ID] ASC
     ))  on [PRIMARY]

这里是空间索引的 DDL:

CREATE SPATIAL INDEX [IX_GeoLocation_Geo] ON dbo.[Test]
    (
        GeoLocation
    )USING  GEOMETRY_GRID 
    WITH (BOUNDING_BOX =(-180, -90, 180, 90), GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), CELLS_PER_OBJECT = 1024, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

我在[ID] 列上有主键,在GeoLocation 列上有一个空间索引。对于空间索引,我使用镶嵌模式“几何自动网格”。

即使我在数据库中只有几千行,获取最近邻居的查询也很慢。

    SELECT top 15 T.ID
    FROM dbo.TestT --with(index(IX_SpatialData_Geo))
          WHERE T.Geo.Filter(@region) = 1

实际上,通过添加表提示,(强制使用空间索引)查询的性能正在下降而不是提高性能:)

谢谢

【问题讨论】:

    标签: sql-server spatial-index


    【解决方案1】:

    根据BOL,您的谓词不是空间索引支持的谓词。试试吧:

    SELECT top 15 T.ID
    FROM dbo.TestT --with(index(IX_SpatialData_Geo))
          WHERE T.Geo.STIntersects(@region) = 1
    ORDER BY T.Geo.STDistance(@region)
    

    注意,如果您正在寻找最接近的,您必须在其中放置一个ORDER BY 子句; TOP 没有一个是任意的。

    【讨论】:

    • 现在是最糟糕的事件。我认为问题在于我创建空间索引的方式。
    • 过滤效率为0,不明白为什么。 Internal_Filter_Efficiency 0 Primary_Filter_Efficiency 0.130907186804556
    • 嗯...有趣。您可以在原始问题中发布表的 DDL 和空间索引吗?我也会要求一些示例数据,但这可能会推动它......
    • 我刚刚添加了用于创建表和索引的 DDL。对于数据,您可以轻松地创建一个非常短的脚本。谢谢:)
    • 另一方面,您的索引可能没有足够的选择性。这依赖于数据。考虑一个非空间查询,其中您在列上有一个索引,并且您的 where 子句最终可能会使用该索引,但最终会返回表的很大一部分。优化器将选择进行表扫描,因为它通过预读获得了更高的效率。
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2012-08-10
    • 1970-01-01
    • 2018-09-06
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多