SQL Server存在vs连接-性能问题
我有两个几乎相同的查询。一个在几分钟内执行,另一个超时或超过20分钟。研究了内部连接与拥有之间的比较,但没有在网上找到(仅查找何处与内部连接,或何处与拥有)。我想理解为什么一个比另一个工作得快得多。第一个查询工作正常,第二个查询工作不正常: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
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分钟。没有关于表格的一些细节,我们只能猜测。