2017-06-05 116 views
1

我有一个查询尝试查找某个边界框[地理编码查找]中的所有记录。为什么我的查询执行聚集索引扫描

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

enter image description here

有后环顾四周SO和谷歌,我决定,包括我的索引中的表的所有列。这里是我有什么指数

  • PK上的Id。在[UTC_UPDATED说明,北,东,南,西]
  • 指数[包括所有其他列尽量避免扫描]对[UTC_UPDATED说明,来源说明]
  • 指数

查询:

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来查找正确的Geocoded地址,但它非常慢,我选择使用SQL [它们只是双倍]来找到粗糙的NESW边界框,然后在代码[.NET]中相交。

+1

在决定放弃SQL Server地理支持之前,您是否考虑/测试空间索引?鉴于大多数搜索谓词都是不等式,非聚集索引实际上是无用的。 –

+1

从小处着手,重点关注您的搜索谓词(where子句)并返回您在内部Project 1表中过滤的列之一。确认它使用您的非聚集索引。添加额外的列可能会混淆优化器。 – user3112728

+0

没有可以使用的索引。您的索引的前导列是UTC,并且在查询中没有UTC的条件。集群索引扫描是唯一可行的方法。 – sepupic

回答

0

SQL Server是否决定执行扫描还是查找取决于查询的选择性。在你的情况下,扫描只是比寻求更便宜。索引是否覆盖查询不是问题。请阅读有关tipping point

+0

只是一个说明,这当然是基于估计,当然这可能是错误的。您可以通过添加索引提示来查看您的情况,只是为了查看索引行为有多好/差。我不会真的推荐在生产环境中使用它,尽管 –

+0

@PawełKucharski 他说他在他的索引中包含*所有需要的列*,以便了解您在查找什么查找? – sepupic

+0

我的意思是寻求,现在修好了。对于那个很抱歉。 – PacoDePaco

相关问题