代码之家  ›  专栏  ›  技术社区  ›  Matt Evans

未使用SQL Server 2008空间索引

  •  3
  • Matt Evans  · 技术社区  · 14 年前

    我有一个地理专栏。我已经创建了一个空间索引,但它没有被使用:

    declare @geog geography 
    select @geog = 'POINT (18.12 -33.2)' 
    
    select  *
    from  dbo.product  WITH(INDEX(IX_Spatial))  
    where 
    @geog.STDistance(GeoLocation) > 1000
    

    索引的创建方式如下:

     CREATE SPATIAL INDEX [IX_Spatial] ON [dbo].[Product] 
    (
     [GeoLocation]
    )USING  GEOGRAPHY_GRID 
    WITH (
    GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
    CELLS_PER_OBJECT = 1024, 
    PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, 
    DROP_EXISTING = OFF, ALLOW_ROW_LOCKS  = ON, 
    ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO
    

    不同级别的网格密度值不是故意设置为中等。如果查看估计的执行计划,则不使用索引。

    [http://blogs.msdn.com/b/isaac/archive/2008/08/29/正在使用我的空间索引。aspx][1]

    如果我试图向查询优化器添加提示

    声明@geog geography
    选择@geog='点(18.12-33.2)'
    
    选择*
    从dbo.product WITH(INDEX(IX_Spatial))
    哪里
    @地理距离(地理位置)>1000
    

    我得到这个错误:

    查询处理器无法生成 查询的查询计划 空间索引提示。原因:空间 索引不支持比较器 在谓词中提供

    我的数据库以SQL Server 2008(100)兼容级别运行。

    .

    1 回复  |  直到 14 年前
        1
  •  2
  •   Quassnoi    14 年前

    SQL Server 按以下方式创建空间索引:将整个地图拆分为多个矩形( tiles )并索引每个平铺的数量。

    对于任何给定点,都可以计算矩形的数目 在内部 一段距离但不是 外面的 距离(可以有无限多个)。