2011-02-25 58 views
0

我正面臨一個可能有人遇到過的新開發中的低性能問題。有很多方法可以執行反向地理編碼過程。我有一個存儲過程來獲取反向地理編碼器。使用SQL Server進行反向地理編碼

問題是具有「路段(作爲地理位置)」的表是具有大約624801行的非常大的表格。

對於單個反向地理編碼器,它在臺式計算機上需要2秒,但是如果您記住我們有1000輛車輛每分鐘要求反向地理編碼服務,那意味着我必須提高服務質量性能。你能幫助減少查詢時間嗎?

在此先感謝

SELECT TOP 1 WITH TIES *, b.GEOGraphy.STDistance(@input) AS dist 
FROM Numbers n 
JOIN UK b WITH(INDEX(spatial_geography_index)) -- index hint 
    ON b.Geography.STDistance(@input) < @start*POWER(CAST(2 AS FLOAT),n.n) 
    AND b.Geography.STDistance(@input) >= CASE 
     WHEN n = 1 THEN 
      0 
     ELSE 
      @start*POWER(CAST(2 AS FLOAT),n.n-1) 
     END 
WHERE n <= 10 
ORDER BY n ) 

SELECT TOP 1 @name=Name, 
FROM NearestNeighbor 
ORDER BY n,dist 
+0

您可以發佈您正在運行的sp以及任何表索引的信息嗎? – Matthew

+0

我的sp包含最近的鄰居,如issac在微軟中所解釋http://blogs.msdn.com/b/isaac/archive/2008/10/23/nearest-neighbors.aspx – user98454

+0

SELECT TOP 1 WITH TIES *,b.GEOGraphy .STDistance(@input)AS dist FROM Numbers n JOIN UK b WITH(INDEX(spatial_geography_index)) - index hint \t \t ON b.Geography.STDistance(@input)<@ start * POWER(CAST(2 AS FLOAT) ,nn) \t \t AND b.Geography。STDistance(@input)> = \t \t \t CASE當n = 1 THEN ELSE 0開始@ *功率(CAST(2 AS FLOAT),NN-1)END \t \t \t其中N <= 10 \t \t \t ORDER由N個\t \t \t \t)SELECT TOP 1 @名稱=名稱, \t從最近鄰 \t ORDER BY N,DIST – user98454

回答

0

兩個想法浮現在腦海中開始:

  1. 我想你可以創建一個搜索索引(使用像獅身人面像),這將允許你這樣做非常快速查找,但您必須小心創建滿足您需求的索引。您可能希望將lat/lng設置爲一個屬性,以便始終進行單個匹配,然後使用lat/lng作爲過濾器執行所有反向地理編碼查找。 http://sphinxsearch.com/
  2. 你願意依靠外部的API還是你有太多的流量?谷歌在這裏暴露了一個反向地理編碼API:http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true_or_false
+0

我不想使用外部API。我正在開發一個獨立的應用程序來完成這個使用c#完成。 – user98454

1

與任何地理數據查詢,可以加快速度,如果你知道一些關於你的現實VS您的數據。

例如,您是否有關於特定車輛應該在哪裏的信息?他們是否運行常規路線?每輛卡車都有一個與某一特定地區相關的數字嗎?如果是這樣,你可以縮小搜索範圍,提供一個你期望找到結果的範圍(然後根據需要擴展)......雖然實際上這只是Isaac Kunin已經提出的方法的擴展。

艾薩克·庫尼提供瞭如何快速找到地理數據知道你有附近的鄰居,但如果您的樣本空間需要遇到一個鄰居前增長了很多他的方法可能表現不佳很好的啓示。即使這樣,它也需要你對現實有所瞭解,如果你的數據......比如說適合迭代搜索有多大?

底線是這樣的:

如有任何查詢,如果您不希望掃描所有數據必須在一個合適的方式來縮小搜索第一個決定。這需要與您的數據保持一定的親密關係,並根據您的使用情況進行一些智能設計。

+0

謝謝馬修。我會通讀我的用例,並會看到 – user98454