2011-08-19 1 views
0

우리는 20million + geoWe 위치 (및 성장)와 SQL 2008 데이터베이스를 가지고, 각 위치는 표준 이름/주소/지리/ID/기타 컬럼을 포함합니다.20mill + 레코드에 대한 효율적인 SQL 지리 wilcard 이름 검색

거리를 기준으로 레코드를 효율적으로 검색 할 방법이 필요하지만 전체 텍스트 색인을 통해 "포함"키워드도 검색해야합니다. 기본 아이디어는 최대 거리를 기준으로 우리 주변의 위치를 ​​검색하는 것입니다.

지금 우리는 1 마일 이내에 StarBucks와 같은 전체 문자열을 검색 할 때 검색이 몇 초 내에 돌아옵니다. 그러나 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 포럼을 사용하려고 노력해 왔습니다.

다른 검색어는 거리 또는 특정 카테고리 ID만을 기반으로하며, 1 초 이내에 반환됩니다. 큰 문제는 와일드 카드 문자열 일치입니다.

누군가 20million + 레코드를 처리 할 때 이름 (와일드 카드 지원) 및 거리를 허용하는 멋진 SQL 또는 CLR proc를 가지고 있습니까?

는 지금 우리는 매우 붙어 :(사전에

덕분에, 제프

당신이 'star%'를 검색하고 열이 인덱스가 잘 경우

답변

0

간단한 LIKE 조건은 거의 작동됩니다. 성능 SQL Server의 Full-Text 메커니즘을 설정할 수 있다면 더 좋을 것입니다. 어렵지 않고 인덱스 된 것보다 더 빠릅니다. LIKE