2011-06-23 6 views
1

すべてのジオコードされた130万のレコードを持つテーブルに空間インデックスを設定しました。これらの値は、地理データ型の列に格納されます。私が抱えている問題は、空間インデックスを持つこの列をクエリすると、実際にはまだ遅いということです。たとえば、マイルの範囲内のすべてのアカウントを見つけるのに約20秒かかります。ここでジオコードの範囲内のすべてのポイントを検索しようとすると、空間インデックスが遅くなります。これをもっと速くするにはどうすればいいですか?

が遅い実行されるクエリの例です:

CREATE SPATIAL INDEX [IX_CI_Geocode] ON [dbo].[CustomerInformation] 
(
    [Geocode] 
)USING GEOGRAPHY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = LOW,LEVEL_3 = LOW,LEVEL_4 = LOW), 
CELLS_PER_OBJECT = 128, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
GO 

データは、単一の状態の部分ではすべての家である:ここでは

DECLARE @g Geography; 
SET @g = (select ci.Geocode from CustomerInformation ci where ci.CIOI = 372658) 

DECLARE @region geography = @g.STBuffer(1609.344) 

Select top 100 ci.Geocode.STDistance(@g), ci.CIOI 
from CustomerInformation ci 
where ci.Geocode.Filter(@region) = 1 
order by ci.Geocode.STDistance(@g) asc 

は私のCREATE INDEX文です。マイルの半径は1000ポイント以上になると思います。これを正しく索引付けしていますか?どんな助けも素晴らしいだろう。

別のスロークエリ例:

DECLARE @g Geography; 
SET @g = (select ci.Geocode from CustomerInformation ci where ci.CIOI = 372658) 

select top(100) CIOI, (ciFinding.Geocode.STDistance(@g)/1609.344) as Distance, ciFinding.Geocode.ToString() --ciFinding.Geocode.STDistance(@g)/1609.344 
from CustomerInformation ciFinding 
where ciFinding.Geocode.STDistance(@g) is not null and ciFinding.Geocode.STDistance(@g) < 1609.344 
order by ciFinding.Geocode.STDistance(@g) 

答えて

5

あなたは、私は2008 R2は、このかかわらずを解決しているかもしれないと思う、すなわち(INDEX([INDEX_NAME])WITHインデックスヒントを()を使用する必要があるかもしれません

Select top 100 
ci.Geocode.STDistance(@g), ci.CIOI 
from CustomerInformation WITH(INDEX(IX_CI_Geocode)) 
ci where ci.Geocode.Filter(@region) = 1 
order by ci.Geocode.STDistance(@g) asc 
関連する問題