2012-01-27 108 views
2

我需要根據當前位置並在特定半徑內提取地址列表。我們的默認搜索允許25英里的半徑,而其他選項則返回約5400個結果。我們將地址存儲爲地理點,並創建了相當不錯的搜索,但查詢需要大約3秒才能運行。仔細觀察執行計劃,我發現排序需要最多的時間,這很有意義。我能做些什麼來加快速度?我們並不在乎它是否超級確切,足夠接近並且估計沒問題。我們正在使用的查詢低於大部分其他過濾和分頁邏輯。SQL地理按距離排序的快速最近鄰居

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」,迫使空間索引與查詢提示,並使用 「ORDER BY a.Position.STDistance(@currentPosition)」,而不是ROW_NUMBER( )。

+0

但我使用row_number做分頁,沒有它,它有點擊敗了存儲過程的目的(是的,我知道我可以使用臨時表來僞造它)。 – Josh 2012-04-30 13:04:57

+0

您必須爲該查詢使用Order By。查看http://msdn.microsoft.com/en-us/library/ff929109.aspx – Kelqualyn 2012-04-30 18:32:20

+0

您鏈接到僅與SQL 2012相關的文章,我正在使用2008。 – Josh 2012-05-02 16:58:04