SQL Server存在vs连接-性能问题

SQL Server存在vs连接-性能问题,sql,sql-server,inner-join,having-clause,Sql,Sql Server,Inner Join,Having Clause,我有两个几乎相同的查询。一个在几分钟内执行,另一个超时或超过20分钟。研究了内部连接与拥有之间的比较,但没有在网上找到(仅查找何处与内部连接,或何处与拥有)。我想理解为什么一个比另一个工作得快得多。第一个查询工作正常,第二个查询工作不正常: SELECT IW.OrderCategory , IW.ParkName , IW.TurbineNumber , IW.UserStatus , IW.MaintenancePlan , Chk_List.Chec

我有两个几乎相同的查询。一个在几分钟内执行,另一个超时或超过20分钟。研究了内部连接与拥有之间的比较,但没有在网上找到(仅查找何处与内部连接,或何处与拥有)。我想理解为什么一个比另一个工作得快得多。第一个查询工作正常,第二个查询工作不正常:

SELECT IW.OrderCategory
    , IW.ParkName
    , IW.TurbineNumber
    , IW.UserStatus
    , IW.MaintenancePlan
    , Chk_List.Checklist_Description
    , Chk_List.DateTimeStamp
    , Chk_List.Stamp
    , Chk_List.Man
    , Chk_List.type
    , Chk_List.Joint
    , Chk_List.ToolPos
    , Chk_List.Tech
FROM   ServiceWorkOrders.EDW.SAP_ServiceOrders_IW73 AS IW
      INNER JOIN dbo.vwSQL_Checklist_data_w_item_details AS Chk_List ON IW.TurbineNumber = Chk_List.Turbine_Num
GROUP BY IW.OrderCategory
      , IW.ParkName
      , IW.TurbineNumber
      , IW.UserStatus
      , IW.MaintenancePlan
      , Chk_List.Checklist_Description
      , Chk_List.DateTimeStamp
      , Chk_List.Stamp
      , Chk_List.Man
      , Chk_List.type
      , Chk_List.Joint
      , Chk_List.ToolPos
      , Chk_List.Tech
HAVING(IW.ActualStartDate = MAX(Chk_List.DateStamp));

SELECT IW.OrderCategory
    , IW.ParkName
    , IW.TurbineNumber
    , IW.UserStatus
    , IW.MaintenancePlan
    , Chk_List.Checklist_Description
    , Chk_List.DateTimeStamp
    , Chk_List.Stamp
    , Chk_List.Man
    , Chk_List.type
    , Chk_List.Joint
    , Chk_List.ToolPos
    , Chk_List.Tech
FROM   ServiceWorkOrders.EDW.SAP_ServiceOrders_IW73 AS IW
      INNER JOIN dbo.vwSQL_Checklist_data_w_item_details AS Chk_List ON IW.TurbineNumber = Chk_List.Turbine_Num
                                                           AND IW.ActualStartDate = Chk_List.DateStamp
GROUP BY IW.OrderCategory
      , IW.ParkName
      , IW.TurbineNumber
      , IW.UserStatus
      , IW.MaintenancePlan
      , Chk_List.Checklist_Description
      , Chk_List.DateTimeStamp
      , Chk_List.Stamp
      , Chk_List.Man
      , Chk_List.type
      , Chk_List.Joint
      , Chk_List.ToolPos
      , Chk_List.Tech;

执行计划显示了什么?哪个查询运行得较慢?它们的执行方式不同,因为它们不是同一条语句。如果没有示例数据,我不知道您的最终目标是什么,但是更改连接条件并添加一个
have
将为优化器提供不同的信息位来猜测最佳计划。如果您可以附加执行计划和/或表模式,这可能有助于进一步指导您。
having
子句必须首先进行聚合,然后根据max-datestamp进行过滤,而join则以相反的顺序进行过滤。首先,第一个查询不必将
IW.ActualStartDate
Chk\u列表的每个记录进行比较。datestamp
只接受
max
。适当的索引也可能有助于第二个查询的性能。如果两个表中都没有数千万行,我建议您的第一个查询太慢,如果需要2分钟。没有关于表的详细信息,我们只能猜测。执行计划显示了什么?哪个查询运行得较慢?它们的执行方式不同,因为它们不是同一条语句。如果没有示例数据,我不知道您的最终目标是什么,但是更改连接条件并添加一个
have
将为优化器提供不同的信息位来猜测最佳计划。如果您可以附加执行计划和/或表模式,这可能有助于进一步指导您。
having
子句必须首先进行聚合,然后根据max-datestamp进行过滤,而join则以相反的顺序进行过滤。首先,第一个查询不必将
IW.ActualStartDate
Chk\u列表的每个记录进行比较。datestamp
只接受
max
。适当的索引也可能有助于第二个查询的性能。如果两个表中都没有数千万行,我建议您的第一个查询太慢,如果需要2分钟。没有关于表格的一些细节,我们只能猜测。