我有一个查询尝试查找某个边界框[地理编码查找]中的所有记录。
在通过RedGate探查器运行查询计划后,它在聚集索引扫描(下面)中花费了大量时间(问题底部的违规查询)。这是我运行速度最慢的查询,我猜它有一些问题,因为这最后一步花了这么长时间?
在浏览了SO和Google后,我决定在索引中包含表格的所有列。这是我的索引
查询:
SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; SET ARITHABORT OFF; SET CONCAT_NULL_YIELDS_NULL ON; SET NUMERIC_ROUNDABORT OFF; SET QUOTED_IDENTIFIER ON
(@p__linq__0 datetime2(7),@p__linq__1 float,@p__linq__2 float,@p__linq__3 float,@p__linq__4 float)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
注意边界和中心是地理类型。我最初使用Intersects找到正确的地理编码地址,但它太慢我选择使用SQL找到粗糙的NESW边界框[它们只是双倍]然后在代码[.NET]中交叉。