3

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

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) 兼容级别运行。

.

4

1 回答 1

2

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

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

于 2010-11-11T12:32:49.297 回答