2010-03-22 99 views
2

我有一張滿載經銷商的表格以及他們的經度和緯度。我正在努力確定最接近的n個經銷商,以確定任何給定的緯度和經度。我已經有了計算位置之間距離的功能,但我想盡可能少地進行計算(我的表格可以包含數千個條目)。目前我必須計算每個條目的距離,然後對它們進行排序。在進行計算以提高性能之前,是否有任何方法進行排序?SQL 2003距離緯度經度

This問題很好,但是我並不總是知道我的範圍。我應該選擇一個任意高的範圍,然後改進我的結果?我很感謝社區提供的任何幫助。

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53 

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

回答

1

而是對所有記錄執行你的計算,你可以用你的拉/長號碼的簡單畢達哥拉斯計算和選擇前20名。然後,您可以使用更準確的功能選擇實際的前10名。雖然這是不準確的,但它應該足夠準確以減少數據集。

編輯:事情是這樣的

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53 

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
WHERE 
    MemberId IN 
(
    SELECT TOP 20 
     MemberID 
    FROM 
     Dealers 
    ORDER BY 
     SQRT(SQUARE(@Lat - Lat) + SQUARE(@Lon - Lon)) 
) 
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

不過,我建議你與你的數據集都試一下,並簡介它,看看實際表現的差異可能是什麼。

+0

謝謝。這確實可以提高性能(隨着記錄數量的增加,性能會提高)。如果我不需要實際的距離,是否有遺漏內部查詢的錯誤,並使用'SQRT(SQUARE(@Lat - Lat)+ SQUARE(@Lon - Lon))' – 2010-03-23 00:28:26

+1

距離等於30英里或更小畢達哥拉斯精確到幾百英尺。使用Haversine功能可獲得更遠的距離。 – 2010-03-23 01:29:34

1

我想你真的很喜歡地理空間索引。否則,隨着行數增加非常大,您將不得不訪問每一行來執行畢達哥拉斯計算。

它看起來像SQL Server支持空間數據類型,SQL Server 2008甚至吹噓爲「new spatial indexes for high performance queries」。您可以使用SQL Server空間數據類型,然後對空間索引執行鄰近查詢嗎?

相關問題