我有一個GeocodedPoints表。我正在優化的這個查詢嘗試爲經緯度位置提取匹配點。不幸的是它太慢了!優化邊界框查詢
該表基本上是邊界框和相應地址的列表。它還包含精確邊界框的DBGeography,但是,鑑於SQL在這種情況下的速度有多慢,我將它轉化爲.NET land並在那裏查詢DBGeography。
我的查詢然後基本上看看是否在邊界框內[由NESW指定]並返回結果。
在我看來,這應該是非常快,但唉,它並不像我想的那樣快。
我對邊界一個無唯一,非聚集索引和像這樣
注意,因爲我們只返回已修改在過去2結果UTC需要對UTC周。
我已經通過SQL事件探查器工具來運行這一點,這裏的一些信息:
- 50萬行該表
- 時間從每次通話
- 250-350ms範圍從5-20k 讀取範圍
最後這裏是我的查詢使用
exec sp_executesql N'SELECT
[Project1].[ID] AS [ID],
[Project1].[CENTER] AS [CENTER],
[Project1].[BOUNDS] AS [BOUNDS],
[Project1].[UTC_UPDATED] AS [UTC_UPDATED],
[Project1].[PLACE_ID] AS [PLACE_ID],
[Project1].[FORMATTED_ADDRESS] AS [FORMATTED_ADDRESS],
[Project1].[POST_CODE] AS [POST_CODE],
[Project1].[SOURCE] AS [SOURCE],
[Project1].[North] AS [North],
[Project1].[East] AS [East],
[Project1].[South] AS [South],
[Project1].[West] AS [West]
FROM (SELECT
[Extent1].[ID] AS [ID],
[Extent1].[CENTER] AS [CENTER],
[Extent1].[BOUNDS] AS [BOUNDS],
[Extent1].[UTC_UPDATED] AS [UTC_UPDATED],
[Extent1].[PLACE_ID] AS [PLACE_ID],
[Extent1].[FORMATTED_ADDRESS] AS [FORMATTED_ADDRESS],
[Extent1].[POST_CODE] AS [POST_CODE],
[Extent1].[SOURCE] AS [SOURCE],
[Extent1].[North] AS [North],
[Extent1].[East] AS [East],
[Extent1].[South] AS [South],
[Extent1].[West] AS [West]
FROM [dbo].[HST_GEOCODE_POINTS] AS [Extent1]
WHERE ([Extent1].[UTC_UPDATED] > @p__linq__0) AND ([Extent1].[North] >= @p__linq__1) AND ([Extent1].[East] >= @p__linq__2) AND ([Extent1].[South] <= @p__linq__3) AND ([Extent1].[West] <= @p__linq__4)
) AS [Project1]
ORDER BY [Project1].[UTC_UPDATED] DESC, [Project1].[SOURCE] DESC',N'@p__linq__0 datetime2(7),@p__linq__1 float,@p__linq__2 float,@p__linq__3 float,@p__linq__4 float',@p__linq__0='2017-05-16 11:12:12.4425257',@p__linq__1=53.016466402998645,@p__linq__2=-1.715320912729779,@p__linq__3=53.016466402998645,@p__linq__4=-1.715320912729779
注意我的UTC當前是第一個在這個查詢中,但最後在索引。具有諷刺意味的是,這似乎使我的查詢速度更快,但每次調用都能達到20k次。
@GordonLinoff我不確定你的意思?我已經在桌面上有一個DBGeography,但不能用它查詢太慢。 – Chris
注意從SQL Sentry Plan Explorer(一個免費工具)添加執行計劃?這會有很大的幫助。 –
通常在兩週內更新了多少行。如果沒有那麼多,它可能會*更有效率的日期列在索引中第一個... – user1429080