2010-11-11 20 views
3

J'ai une colonne de type géographie. J'ai créé aa index spatial, mais ce ne sont pas utilisés:L'index spatial SQL Server 2008 n'est pas utilisé

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

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

L'indice est créé comme ceci:

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 

Les valeurs de densité du réseau aux différents niveaux sont pour ne pas délibérément à moyen . Cela ne fait aucune différence ce que je les ai mis, Si je vois le plan d'exécution estimé, l'index n'est pas utilisé.

[http://blogs.msdn.com/b/isaac/archive/2008/08/29/is-my-spatial-index-being-used.aspx][1]

Si je essayez d'ajouter une touche à l'optimiseur de requêtes

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

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

Je reçois cette erreur:

The query processor could not produce a query plan for a query with a spatial index hint. Reason: Spatial indexes do not support the comparator supplied in the predicate

Ma base de données est en cours d'exécution à SQL Server 2008 (100) de niveau de compatibilité.

.

Répondre

2

SQL Server crée des index spatiaux de la manière suivante: il divise l'ensemble de la carte en plusieurs rectangles (tiles) et indexe le nombre de chaque tuile.

Pour un moment donné, il est possible de calculer le nombre de rectangles au sein une distance, mais pas sur de la distance (il peut y avoir une infinité de).

+0

Ce qui explique pourquoi l'utilisation de moins utilise l'index. Merci –