У меня есть база данных с примерно 1 миллионом мест (координат), размещенных на Земле.На моем веб-сайте есть карта (Google Maps), которая позволяет пользователям находить эти места путем увеличения масштаба карты.
База данных - это SQL Server 2008 R2, и я создал пространственный столбец для расположения каждого маркера.,
Проблема в том, что мне нужно резко сократить время запроса.Например, область карты, покрывающая несколько квадратных километров, которая возвращает, возможно, 20000 точек - этот запрос занимает около 6 секунд процессорного времени на очень быстром четырехъядерном процессоре.
Я создаю фигуру из видимой области карты, например:
DECLARE @shape GEOGRAPHY = geography::STGeomFromText('POLYGON((' +
CONVERT(varchar, @ne_lng) + ' ' + CONVERT(varchar, @sw_lat) + ', ' +
CONVERT(varchar, @ne_lng) + ' ' + CONVERT(varchar, @ne_lat) + ', ' +
CONVERT(varchar, @sw_lng) + ' ' + CONVERT(varchar, @ne_lat) + ', ' +
CONVERT(varchar, @sw_lng) + ' ' + CONVERT(varchar, @sw_lat) + ', ' +
CONVERT(varchar, @ne_lng) + ' ' + CONVERT(varchar, @sw_lat) + '))', 4326)
И запрос затем делает выбор на основе этого:
@shape.STIntersects(MyTable.StartPoint) = 1
а) Я убедился, что индекс действительно используется (проверил фактический план выполнения).Также пробовал с индексными подсказками.б) Я также попытался сделать запрос, выбрав все на определенном расстоянии от центра карты.Это немного лучше, но это все еще занимает много секунд.
Пространственный индекс выглядит следующим образом:
CREATE SPATIAL INDEX [IX_MyTable_Spatial] ON [dbo].[MyTable]
(
[MyPoint]
)USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Что можно сделать, чтобы значительно улучшить этот поиск?Должен ли я иметь индекс на основе геометрии вместо этого?Или есть другие параметры для индекса, которые выбраны неправильно (они являются настройками по умолчанию)?
РЕДАКТИРОВАТЬ ------------------
Я вообще не использовал пространственные индексы SQL Server.Так как мне нужно только выполнять простой поиск в квадрате карты, использование десятичного типа данных и нормального поиска <= и> = намного быстрее и вполне достаточно для этой цели.Спасибо всем за помощь!