2017-07-14 100 views
-1

我有一个查询,我试图运行。现在,我正在使用开始和结束日期参数。大约50秒后,我总共获得了33排,我觉得这是非常多的时间。当我删除参数时,返回1582行;这只需要53秒即可返回。SQL Server查询需要超过50秒才能执行

我完全丧失了做什么。我曾尝试删除任何多余的连接(有几个);这没有减少查询返回时间。如果可能的话,能够在30秒内返回查询会很好。谢谢。

DECLARE @StartDate DATETIME 
SET @StartDate = '2017-04-30 00:00:00.000' 
SET @EndDate = '2017-07-31 08:00:00.000' 
SELECT 
a.PrimaryEventID, 
b.Event_Name as 'PrimaryEventName', 
b.Event_StartTime as 'EventDate', 
e.UserLastName+', '+e.UserFirstName as 'Operator', 
f.Activity_MetaDataFieldValue as 'Type', 
'Status' = Case 
     When c.EventStatus = 0 then 'Tent' 
     When c.EventStatus = 1 then 'Appr' 
     When c.EventStatus = 2 then 'Pend' 
     Else 'No Status Found' 
End, 
CONVERT(varchar(20), a.PrimaryEventID)+'|'+CONVERT(varchar(20), e.UserId) 
as 'JoinColumn', 
b1.Activity_MetaDataTypeID 
FROM 
    views.mcd_DWH_LinkedEvents a 
    Left JOIN dwh.mcd_DWH_Events b ON a.PrimaryEventID = b.Event_ID 
    Left JOIN rawViews.mcd_DWH_ActivitiesBasicData b1 on b.EventActivity_ID = b1.Activity_ID 
    Left JOIN dwh.mcd_DWH_Events c ON a.LinkedEventID = c.Event_ID 
    Left JOIN dwh.mcd_FWT_UserEventAssociations_Detailed_Manager d ON a.LinkedEventID = d.Event_ID 
    Left JOIN views.mcd_FWT_UsersBasicData e ON d.User_ID = e.UserID 
    Left JOIN views.mcd_FWT_ActivitiesExtraDetails f ON c.EventActivity_ID = f.Activity_ID and f.Activity_MetaDataFieldName = 'Type' 
    Left JOIN views.mcd_FWT_TrainingProgramsBasicData g ON c.EventTrainingProgram_ID = g.TrainingProgramID 
    Left JOIN views.mcd_FWT_MPlansBasicData h ON g.TrainingProgram_MPlanID = h.MPlanID 
WHERE d.Activity_TypeID = 57 
    and b.Event_StartTime between @StartDate and @EndDate 
    and (f.Activity_MetaDataFieldValue = 'Qual' or f.Activity_MetaDataFieldValue = 'Run' or f.Activity_MetaDataFieldValue = 'Assess') 
GROUP by a.PrimaryEventID, b.Event_Name,b.Event_StartTime, h.MPlanName, f.Activity_MetaDataFieldValue, e.UserLastName, e.UserFirstName, c.EventStatus, e.UserId, b1.Activity_MetaDataTypeID 
+1

你在加入的列上有索引吗?并且'b.Event_StartTime'也是一个DATETIME字段(即:它是否与您用于查询的变量的数据类型相同?如果不是,则不会使用该索引) – RToyo

+1

当您查看查询计划它建议任何索引?如果我不得不猜测,那么你可能每个人都需要花费几秒钟的时间,这加起来。 – SteveB

+4

在没有看到执行计划的情况下,我们无能为力。 – DavidG

回答

1

首先,让我们剔除期望与现实。这听起来好像你逻辑上认为Where语句会使你的查询花费更少的时间。尽管逻辑上,这似乎是有道理的,但这不是SQL Server的运作方式。

考虑https://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/from那里我们看到的

  1. 操作的顺序
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. 选择
  9. DISTINCT 10 ORDER BY
  10. TOP

SQL Server实际上你的WHERE参数完成完整的查询然后限制它。如果非要在这个数据库中的表管理访问,我会考虑在加入索引,以最小:

  • 现场Event_StartTime
  • 事件ID,LinkedEventID和用户名在每个表dwh.mcd_DWH_Events(如果不是主键)
  • dwh.mcd_FWT_UserEventAssociations_Detailed_Manager现场Activity_TypeID现场Activity_MetaDataFieldValue

一个好的

  • views.mcd_FWT_ActivitiesExtraDetails经验法则是日期和id应该被编入索引,并且一般而言,您将合理地定期将其放置到where语句中的任何字段。

  • +1

    所有的优点,但他们可能并没有真正回答OP的问题,主要是因为没有足够的信息,所以没有人可以回答这个问题...... – DavidG

    +1

    这是**逻辑**操作顺序。不是物理的。 “SQL Server实际完成完整的查询,然后通过WHERE参数限制它”绝对不是您可以认为通常是真实的陈述。这是查询优化器的重点。 –

    相关问题