【问题标题】:Trying to see how I can improve the performance of this Sql query试图了解如何提高此 Sql 查询的性能
【发布时间】:2011-04-27 04:43:03
【问题描述】:

我有一个 SQL 查询,它试图查找某些县的所有社区。​​p>

当我使用 SQL Sentry Plan Explorer 来可视化查询时(IMO,比 MS SSMS 提供的工具好一点),它突出显示了一个执行速度非常慢的部分:-

完整计划

放大....

详情

SQL 脚本:

 -- Update which Neighbourhoods are in these Counties.
INSERT INTO @NeighbourhoodCounties (NeighbourhoodId, CountyId)
 SELECT SubQuery.NeighbourhoodId, SubQuery.CountyId
 FROM (
  SELECT e.LocationId AS NeighbourhoodId, b.LocationId AS CountyId, 
      c.OriginalBoundary.STArea() AS CountyArea,
      c.OriginalBoundary.STIntersection(d.OriginalBoundary).STArea() AS IntersectionArea
  FROM @CountyIds a
   INNER JOIN [dbo].[Counties] b ON a.Id = b.LocationId
   INNER JOIN [dbo].[GeographyBoundaries] c ON b.LocationId = c.LocationId
   INNER JOIN [dbo].[GeographyBoundaries] d ON c.OriginalBoundary.STIntersects(d.OriginalBoundary) = 1
   INNER JOIN [dbo].[Neighbourhoods] e ON d.LocationId = e.LocationId
   ) SubQuery
    WHERE (SubQuery.IntersectionArea / SubQuery.CountyArea) * 100 > 5 -- a Neighbourhood has to be 5% or more to be considered 'Inside'

谁能帮助解释这个查询?所有这些数字是什么意思?如何使用这些数字来帮助诊断和改进我的查询?

I tried to make an indexed view on the spatial table 但惨败。

谁能帮忙?

【问题讨论】:

  • 是慢还是不喜欢64.5%?

标签: performance sql-server-2008


【解决方案1】:

这很正常。在大多数情况下,您在任何地方都没有粗条。

但是,我确实看到您在 JOIN 中的列上有一个函数

ON c.OriginalBoundary.STIntersects(d.OriginalBoundary) = 1

这无济于事。计算列也无济于事

您还可以在 WHERE = non-sargable 中对列进行计算

(SubQuery.IntersectionArea / SubQuery.CountyArea) * 100

从表面上看,64.5% 的搜索可能是这些 JOIN 和围绕它们工作的优化器的结果

【讨论】:

  • 是的 - 我害怕这个:(简直要了我的命。这个空间的东西应该快得多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多