Эффективный поиск по географическому названию SQL для 20 миллионов записей + - PullRequest
0 голосов
/ 19 августа 2011

У нас есть база данных SQL 2008 с 20 миллионами + географических местоположений (и растущих), каждое местоположение включает в себя стандартные столбцы имя / адрес / география / ID / и т.д.

Нам нужен способ эффективного поиска по записям на основе расстояния, а также ключевое слово «содержит» по полнотекстовому индексу. Основная идея заключается в том, что мы ищем местоположения рядом с нами на основе максимального расстояния.

Прямо сейчас, когда мы ищем полные строки, такие как StarBucks, в пределах 1 мили, поиск возвращается через несколько секунд. Однако, если мы ищем «звезду» в течение 1 мили, поиск может занять несколько минут, чтобы вернуться.

Мы играли вокруг такой логики, как эта:

DECLARE @geoSearchLocation GEOGRAPHY, @geoSearchPolygon GEOGRAPHY, @returncount smallint = 50
SET @geoSearchLocation = geography::Point(40.729047, -74.010086, 4326); --NYC
SET @geoSearchPolygon = geography::STGeomFromText('POLYGON((-74.015086 40.734047, 
                                         -74.015086 40.718047, 
                                         -74.005086 40.718047, 
                                         -74.005086 40.734047, 
                                         -74.015086 40.734047))', 4326);
SET @geoSearchLocation = geography::Point(40.729047, -73.010086, 4326);
SELECT TOP (100) --WITH TIES
*, gt.LocationGeog.STDistance(@geoSearchLocation) AS dist
FROM dbo.GeoLocation_Locations gt WITH (NOLOCK, INDEX(geolocation_HHHH128_sidx))
WHERE gt.LocationGeog.STIntersects(@geoSearchPolygon) = 1
ORDER BY gt.LocationGeog.STDistance(@geoSearchLocation)

Тем не менее, в поиске появляются ошибки и другие проблемы. Мы также пытались использовать форум POWER, который мы нашли в Интернете.

У нас отлично работают другие запросы, основанные только на расстоянии или определенном идентификаторе категории, которые возвращаются менее чем за секунду. Большая проблема заключается в совпадении строк с подстановочными символами.

Есть ли у кого-нибудь замечательный процесс SQL или CLR, который принимает имя (поддержку подстановочных знаков) и расстояние при работе с 20 миллионами + записей?

Прямо сейчас мы очень застряли: (

спасибо заранее, Джефф

1 Ответ

0 голосов
/ 14 августа 2012

Простые LIKE предикаты будут работать только почти хорошо, если вы ищете 'star%', и у этого столбца есть индекс.Однако производительность будет продолжать ухудшаться по мере увеличения набора данных.Если вы сможете настроить полнотекстовый механизм Sql Server, вам будет лучше, это не сложно, и это намного быстрее, чем индексированный LIKE *

...