2012-01-27 10 views
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 

答えて

1

"WHERE a.Position.STDistance(@currentPosition)< 16093.44" は、クエリヒントと空間インデックスを強制使用してみてください、代わりにROW_NUMBERの( "a.Position.STDistance(@currentPosition)BY ORDER" を使用)。

+0

しかし、私はページングを行うためにrow_numberを使用していますが、それは格納されたprocの目的を破るものではありません(はい、私はそれを偽造するために一時テーブルを使うことができます)。 – Josh

+0

そのクエリにはOrder Byを使用する必要があります。 http://msdn.microsoft.com/en-us/library/ff929109.aspx – Kelqualyn

+0

を参照してください。SQL 2012にのみ関連する記事にリンクしました。私は2008年を使用しています。 – Josh