2014-02-07 71 views
1

我有一個SQL查詢運行緩慢,我確定它與距離計算有關。 我使用這些計算進行排序,以便查找項目的用戶可以在地理位置上顯示與其最接近的結果。距離計算效率MSSQL地理

我使用地理函數STDistance來計算距預先計算的sql地理數據類型位置的距離。

LOCATION1是基於用戶的位置

Location1.STDistance(LOCATION2),LOCATION2是該項目的位置。

一旦我們進入成千上萬行,這表現不佳,但我不知道有什麼聰明的方法來做到這一點。我認爲將所有可能的查詢距離計算與查詢時計算相比較並不可行。 (這意味着存儲唯一用戶位置X的唯一物品位置的數量。)

位置由郵政編碼確定。地理範圍僅限於美國。

還有其他想法嗎?

回答

2

人們通常處理緩慢的地理查詢的方式是將集合減小到足夠小以至於可以在合理的時間內執行。就你而言,人們通常使用一種稱爲「地理裝箱」的技術。

這個概念是要找到落在特定緯度/經度邊界內的附近點。例如。如果我想找到42.45678,-22.6543附近的所有人,我首先確定一個典型的最小距離。假設它是25英里或者+ - 0.15度經度和緯度。我會查詢所有這些。 (Lat在41.95和42.95之間,Lon在-22.15和-23.15之間)。然後,我將應用距離函數來查找縮減集內的最近的人。在我消除了顯然不是非常接近的點之後,距離計算要快得多。

如果我的縮減集看起來太大,那麼我可以使用一個更小的盒子。如果我的結果集沒有返回任何行或太少的行,那麼我可以使用遞歸算法來選擇一個越來越大的框,直到找到足夠大的結果集爲止。

這種方法唯一的缺點是它有可能忽略最近的點。想想一個接觸盒子邊緣的圓圈與圓圈內的盒子。包裝盒角落中的點可能會包含在內,但包裝盒外的更近點(x軸或y軸)可能會被排除。緯度/經度箱實際上更像梯形而不是正方形,因爲離赤道越遠。

無論如何,如果速度比完美的準確性更重要。地理拳擊是一個需要考慮的方法。

+0

嗯,我喜歡這個,但是我已經有了一箱,因爲我有拉特,所有的郵政編碼,甚至認爲這不是高度精確,它已經縮小了計算。 – Nate