0

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 を持っている人はいますか?

今、私たちは非常に立ち往生しています:(

前もって感謝します、ジェフ

4

1 に答える 1

0

単純なLIKE述語は、検索していて、その列にインデックスがある場合にのみ、ほとんどうまく機能します。'star%'ただし、データセットが大きくなるにつれて、パフォーマンスは低下し続けます。Sql Server のフルテキスト メカニズムをセットアップできれば、より良い結果が得られます。難しいことではなく、 indexed よりもはるかに高速ですLIKE

于 2012-08-14T13:09:43.960 に答える