Как ускорить мой пространственный поиск в SQL Server? - PullRequest
1 голос
/ 01 сентября 2011

У меня есть база данных с примерно 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.Так как мне нужно только выполнять простой поиск в квадрате карты, использование десятичного типа данных и нормального поиска <= и> = намного быстрее и вполне достаточно для этой цели.Спасибо всем за помощь!

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Вы пытались использовать "подсказку"?Например:

SELECT * FROM [dbo].[TABLENAME] WITH(INDEX( [INDEX_NAME] ))
WHERE 
[TABLENAME].StartPoint.STIntersects(@shape) = 1 
1 голос
/ 01 сентября 2011

SQL Server 2008 (и более поздние версии) поддерживает индексы SPATIAL.

См. http://technet.microsoft.com/en-us/library/bb895373.aspx
для получения списка функций, которые можно использовать, пока еще можно использовать индекс.
Если вы используете любую другую функцию, TSQL не сможет использовать индекс, убивая производительность.

См .: http://technet.microsoft.com/en-us/library/bb964712.aspx
Общая информация о пространственных индексах.

...