为什么我的查询执行聚簇索引扫描

时间:2017-06-05 13:54:32

标签: sql-server

我有一个查询尝试查找某个边界框[地理编码查找]中的所有记录。

在通过RedGate探查器运行查询计划后,它在聚集索引扫描(下面)中花费了大量时间(问题底部的违规查询)。这是我运行速度最慢的查询,我猜它有一些问题,因为这最后一步花了这么长时间?

enter image description here

在浏览了SO和Google后,我决定在索引中包含表格的所有列。这是我的索引

  • PK上的ID。
  • [UTC_UPDATED Desc,North,East,South,West]上的索引[包括尝试避免扫描的所有其他列]
  • [UTC_UPDATED Desc,Source Desc]上的索引

查询:

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]中交叉。

1 个答案:

答案 0 :(得分:0)

SQL Server是否决定进行扫描或搜索取决于查询的选择性。在您的情况下,扫描比寻找便宜。索引是否涵盖查询不是问题。请阅读tipping point