3

タイプgeographyの列があります。空間インデックスを作成しましたが、使用されていません。

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

このエラーが発生します:

クエリプロセッサは、空間インデックスヒントを含むクエリのクエリプランを作成できませんでした。理由:空間インデックスは、述部で提供されたコンパレータをサポートしていません

私のデータベースはSQLServer2008(100)互換性レベルで実行されています。

4

1 に答える 1

2

SQL Server次の方法で空間インデックスを作成します。マップ全体をいくつかの長方形(tiles)に分割し、各タイルの数にインデックスを付けます。

任意の点について、距離内では長方形の数を計算できますが、距離では計算できません(無限に多くなる可能性があります)。

于 2010-11-11T12:32:49.297 に答える