Пространственный индекс SQL Server 2008 не используется - PullRequest
3 голосов
/ 11 ноября 2010

У меня есть столбец типа география.Я создал пространственный индекс, но он не используется:

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).

.

1 Ответ

2 голосов
/ 11 ноября 2010

SQL Server создает пространственные индексы следующим образом: он разбивает всю карту на несколько прямоугольников (tiles) и индексирует номер каждой плитки.

Для любой заданной точки можнорассчитать количество прямоугольников в пределах расстояния, но не из расстояния (их может быть бесконечно много).

...