2,000 万以上の geoWe ロケーション (および増加中) を含む SQL 2008 データベースがあり、各ロケーションには標準の名前/住所/地理/ID/その他の列が含まれています。
距離に基づいてレコードを効率的に検索する方法だけでなく、全文索引を介した「含む」キーワードも必要です。基本的な考え方は、最大距離に基づいて近くの場所を検索することです。
現在、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 フォーラムも使用しようとしています。
距離または特定のカテゴリ ID のみに基づいており、1 秒未満で返される他のクエリがうまく機能しています。大きな問題は、ワイルドカード文字列の一致です。
2000 万以上のレコードを処理するときに名前 (ワイルドカードのサポート) と距離を受け入れる素晴らしい SQL または CLR proc を持っている人はいますか?
今、私たちは非常に立ち往生しています:(
前もって感謝します、ジェフ