2
現在の場所と特定の半径に基づいてアドレスのリストを取得する必要があります。私たちのデフォルトの検索では半径25マイル、他のオプションでは約5400の結果が返されます。私たちは地理的な地点としてアドレスを保存しており、かなりまともな検索を作成していますが、クエリの実行には約3秒かかります。実行計画を見てみると、ソートに最も時間がかかることが分かります。これをスピードアップするために私は何ができますか?私たちはそれが非常に正確で、それほど近くであり、見積もりは大丈夫だと気にしません。使用しているクエリは、他のフィルタリングおよびページングロジックのほとんどをマイナスしています。SQL Geography Fast最近隣の距離順のリスト
declare @currentLatitude float, @CurrentLongitude float
declare @currentPosition geography
declare @radiusBuffer geography
Set @radiusBuffer = @currentPosition.BufferWithTolerance(10 * 1609.344,.9,1);
set @CurrentLatitude = 39.340579
set @CurrentLongitude = -86.697479
SET @currentPosition = geography::Point(@CurrentLatitude, @CurrentLongitude, 4326);
SELECT a.*,
ROW_NUMBER() OVER (ORDER BY rt.Position.STDistance(@currentPosition) ASC) AS RowNum
from [Address] a
where a.Position.Filter(@radiusBuffer) = 1
しかし、私はページングを行うためにrow_numberを使用していますが、それは格納されたprocの目的を破るものではありません(はい、私はそれを偽造するために一時テーブルを使うことができます)。 – Josh
そのクエリにはOrder Byを使用する必要があります。 http://msdn.microsoft.com/en-us/library/ff929109.aspx – Kelqualyn
を参照してください。SQL 2012にのみ関連する記事にリンクしました。私は2008年を使用しています。 – Josh