【问题标题】:SQL Server 2008 Spatial Index is not used未使用 SQL Server 2008 空间索引
【发布时间】:2010-11-11 12:29:38
【问题描述】:

我有一个地理类型的列。我创建了一个空间索引,但它没有被使用:

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/is-my-spatial-index-being-used.aspx][1]

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

declare @geog geography 
select @geog = 'POINT (18.12 -33.2)' 

select  *
from  dbo.product  WITH(INDEX(IX_Spatial))  
where 
@geog.STDistance(GeoLocation) > 1000

我得到这个错误:

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

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

.

【问题讨论】:

    标签: sql-server sql-server-2008 spatial-index


    【解决方案1】:

    SQL Server 通过以下方式创建空间索引:它将整个地图分成几个矩形 (tiles) 并为每个图块的编号编制索引。

    对于任何给定的点,可以计算出内距离但不能外距离的矩形的数量(可以无限多)。 p>

    【讨论】:

    • 这解释了为什么使用小于利用索引。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多