2011-09-05 36 views
7

我有一個龐大的客戶數據庫,在sql server 2005中實現。每個客戶都有一個經度和緯度,表示爲Decimal(18,15)。在數據庫中最重要的搜索查詢試圖找到接近到一定位置,這樣所有的客戶:sql server 2008中的地理數據類型有多好?

(Addresses.Latitude - @SearchInLat) BETWEEN -1 * @LatitudeBound AND @LatitudeBound) 
AND ((Addresses.Longitude - @SearchInLng) BETWEEN -1 * @LongitudeBound AND @LongitudeBound) 

所以,這是一個非常簡單的方法。 @LatitudeBound@LongitudeBound只是數字,用於在點@SearchInLat, @SearchInLng的粗糙邊界矩形內拉回所有客戶。一旦結果到達客戶端PC,一些結果將被過濾掉,以便出現一個邊界圓而不是矩形。 (這是在客戶端PC,以避免在服務器上計算平方根上完成的。)

這種方法已經足夠好了過去。然而,我們現在想讓搜索做更有趣的事情 - 例如,拉回的結果數量更具可預測性,或者讓用戶動態增加搜索半徑的大小。爲了做到這一點,我一直在研究使用它的Geography數據類型,空間索引和距離函數對sql server 2008進行ugprading的可能性。我的問題是:這些速度有多快?

我們此刻的簡單查詢的優點是,它是非常快,不是性能密集型的,因爲它是所謂往往是很重要的。

SearchInPoint.STDistance(Addresses.GeographicPoint) < @DistanceBound 

是通過比較:如何快速將查詢各地像這樣根據?空間索引是否正常工作,並且STDistance是否快速?

回答

8

如果處理只是一個標準的緯度/ LNG作爲你描述對,和你做的是一個簡單的查找,那麼可以說你不打算使用幾何類型,以獲得在向增速的方式很多。

但是,如果你希望得到儘可能你的狀態更加冒險,然後交換使用幾何類型將開闢新的可能性整個世界爲你,而不僅僅是搜索。例如(基於我正在開發的一個項目),你可以(如果是英國數據)下載給定區域的所有城鎮/村莊/城市的多邊形定義,然後做交叉引用以搜索特定的城鎮,或者如果你有路線圖,你可以找到哪些客戶住在主要交通路線,高速公路,主要道路等各種事物旁邊。

你也可以做一些非常花哨的報告,想象一下各個城市的地圖,其中每個大綱都繪製在地圖上,然後用一種顏色陰影以顯示某個地區的客戶密度,一些簡單的幾何SQL將很容易地返回你直接從數據庫中計算出這種信息。

然後有跟蹤,我不知道你處理了什麼數據,或者你爲什麼擁有顧客,但是如果你提供任何東西,喂送貨車的座標,告訴你它與給定的距離有多近顧客。

至於這個問題是STDistance快?這很難說真的,我認爲一個更好的問題是「與......相比是否快速」,除非你有一些可以比較的東西,否則很難說是或否。

空間索引是將數據移動到具有地理位置意識的數據庫的主要原因之一,它們經過優化以獲得給定任務的最佳結果,但是與任何數據庫一樣,如果創建錯誤索引,那麼性能就會變差。

一般而言,你應該看到某種速度的增加,因爲排序和索引中的數學更能意識到數據的目的,而不是像正常索引那樣只是相當線性操作。

請記住,SQL服務器機器越健壯,你會得到更好的結果。

最後一點要提到的是數據管理,如果您使用了GIS知曉的數據庫,那麼它將爲您使用GIS軟件包(例如ArcMap或MapInfo)來管理,修正和可視化數據,更正很容易通過指點,點擊和拖動來完成。

我的建議是創建一個並排表到現有的表,這是格式化爲空間操作,然後編寫一些存儲特效並做一些時間測試,看哪個出來最好。如果你的基本操作有很大的提高,那麼這就是理所當然的,如果它大致相等,那麼你的決定真的取決於你實際想要達到的新功能。

相關問題