Пространственный индекс работает медленно при попытке найти все точки в диапазоне геокода. Как мне сделать это быстрее? - PullRequest
1 голос
/ 24 июня 2011

Я настроил пространственный индекс для таблицы, в которой содержится 1,3 миллиона записей, все из которых геокодированы.Эти значения хранятся в столбце типа данных географии.У меня проблема в том, что когда я запрашиваю этот столбец с пространственным индексом, он все еще очень медленный.Например, чтобы найти все учетные записи за милю, требуется около 20 секунд.

Вот пример запроса, который выполняется медленно:

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

Данные о каждом доме в части одного государства.Так что в радиусе мили я ожидаю, что будет 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)

1 Ответ

5 голосов
/ 24 июня 2011

Возможно, вам потребуется использовать подсказку по индексу (т. Е. WITH (INDEX ([INDEX_NAME])). Я думаю, что 2008 R2 мог бы решить эту проблему, хотя.

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