2012-07-03 45 views
0

我正在嘗試查找距給定座標一定距離內的位置。在一張有大約32k記錄查詢的表上,大約需要2秒鐘 - 這太慢了,imo。空間查詢 - 性能較差,未使用索引

它正在做一個聚集索引掃描,這是邏輯的 - 它必須計算每個位置的距離。但是,我仍然認爲這應該比這個小的數據集更快。我確實已經定義了空間索引,但是它沒有被使用,並且如果我迫使它查詢失敗。

大多數計算的距離都花在濾波器的時間(〜86%) - 所以我正在尋找一個方法來優化這個問題,我在這裏需要一些幫助..

查詢我m使用是這樣的:

SELECT Name 
FROM Venue 
WHERE (Coordinates.STDistance(geography::STPointFromText('POINT(-113.512245 51.498212)', 4326))/1000) <= 100 
+0

[SQL Server 2008空間數據功能對映射查詢有用嗎?]的​​可能的重複?(http://stackoverflow.com/questions/1343293/are-sql-server-2008-spatial-data-features-useful-for -shipping-queries) – TomTom

+1

爲什麼在StDistance子句中除以1000?這可以在別處計算嗎? – CatchingMonkey

+2

更改爲WHERE Coordinates.STDistance(geography :: STPointFromText('POINT(-113.512245 51.498212)',4326))<= 100000將允許使用空間索引作爲主要過濾器而不是表掃描。如果你使用SQL 2008,你可能仍然需要一個明確的索引提示。 –

回答

0

一種老方法是使用BOX firxt。

從你的觀點來看,在盒子的兩端做兩點。 + R/+ R和-R/-R從中心。

然後你可以過濾 - 一個點必須在這個框中,並在你描述的圓圈。

方格檢查可以在索引上運行並殺死大多數元素。

簡單的學校幾何。您在描述的圓周圍畫一個矩形框。

您當前的方法不能使用索引,因爲索引不包含字段。

其他選項:繪製一個圓 - 不要使用距離計算。畫一個圓圈。有點。

或閱讀https://stackoverflow.com/questions/11311363/my-application-is-about-asp-net-using-linq-and-remote-mssql-my-connection-is-be這是你問的同樣的問題。

+0

我有點用..使用STBuffer。 – Evgeni