Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何优化查询以减少执行时间_Sql_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql 如何优化查询以减少执行时间

Sql 如何优化查询以减少执行时间,sql,sql-server-2008,sql-server-2008-r2,Sql,Sql Server 2008,Sql Server 2008 R2,我的查询的order by子句和datetime比较导致执行时间增加,正如我为datetime编制索引一样 SELECT TOP(1) @PeriodStart = DATEADD(SECOND, 1, dbo.tbl_WPT_AttendanceLog.ATDateTime) FROM dbo.tbl_WPT_EmployeeMachineLink INNER JOIN dbo.tbl_WPT_Machine ON dbo.tbl_WPT_Emp

我的查询的order by子句和datetime比较导致执行时间增加,正如我为datetime编制索引一样

SELECT TOP(1) 
    @PeriodStart = DATEADD(SECOND, 1, dbo.tbl_WPT_AttendanceLog.ATDateTime) 
FROM         
    dbo.tbl_WPT_EmployeeMachineLink 
INNER JOIN
    dbo.tbl_WPT_Machine ON dbo.tbl_WPT_EmployeeMachineLink.FK_tbl_WPT_Machine_ID = dbo.tbl_WPT_Machine.ID 
RIGHT OUTER JOIN
    dbo.tbl_WPT_AttendanceLog ON dbo.tbl_WPT_EmployeeMachineLink.FK_tbl_WPT_Machine_ID = dbo.tbl_WPT_AttendanceLog.FK_tbl_WPT_Machine_ID 
                              AND dbo.tbl_WPT_EmployeeMachineLink.MachineEnrollmentNo = dbo.tbl_WPT_AttendanceLog.ATEnrollmentNo
WHERE     
    (dbo.tbl_WPT_EmployeeMachineLink.FK_tbl_WPT_Employee_ID = @EmpID) 
    AND (dbo.tbl_WPT_AttendanceLog.ATDateTime BETWEEN @ShiftEndPreviousInstance AND @ShiftStart) 
    AND dbo.tbl_WPT_AttendanceLog.ATInOutMode in (1,2,5)
    OR (dbo.tbl_WPT_AttendanceLog.ATDateTime BETWEEN @ShiftEndPreviousInstance AND @ShiftStart)
    AND (dbo.tbl_WPT_AttendanceLog.FK_tbl_WPT_Employee_ID = @EmpID) 
    AND dbo.tbl_WPT_AttendanceLog.ATInOutMode in (1,2,5)
ORDER BY
    dbo.tbl_WPT_AttendanceLog.ATDateTime DESC

看起来您正试图从多个来源获取员工的信息(
EmployeeMachineLink
AttendanceLog
)。对吗?如果是这样,我认为您只需要清理
WHERE
子句逻辑:

选择顶部(1)
@PeriodStart=DATEADD(秒,1,dbo.tbl\u WPT\u AttendanceLog.ATDateTime)
来自dbo.tbl\U WPT\U员工机械工程师eml
eml.FK上的内部联接dbo.tbl\u WPT\u Machine\u ID=dbo.tbl\u WPT\u Machine.ID
eml.FK_tbl_WPT_机器上的右外部联接dbo.tbl_WPT_AttendanceLog=dbo.tbl_WPT_AttendanceLog.FK_tbl_WPT_机器\u ID
eml.machineerollmentno=dbo.tbl\u WPT\u AttendanceLog.ATEnrollmentNo
在哪里(
eml.FK_tbl_WPT_Employee_ID=@EmpID或
dbo.tbl_WPT_AttendanceLog.FK_tbl_WPT_Employee_ID=@EmpID
) 
和(在@ShiftEndPreviousInstance和@ShiftStart之间的dbo.tbl_WPT_AttendanceLog.ATDateTime)
(1,2,5)中的dbo.tbl_WPT_AttendanceLog.ATInOutMode
由dbo.tbl\u WPT\u AttendanceLog.ATDateTime DESC订购
变化
-增加了表格别名
eml
,以提高可读性
-删除了(1,2,5)中对dbo.tbl\u WPT\u AttendanceLog.ATInOutMode的重复引用。
-删除了…之间的重复
。。。和…
reference
-将
条件组合在一起

混合使用时必须小心,不要使用括号。否则,这将导致意外的结果,并可能导致性能不佳


如果有帮助,请告诉我。

请参阅此链接,了解有关sql问题和查询相关问题的更多详细信息,请单击此链接@user12158375。你听说过表格别名吗?它们确实使查询更易于编写和阅读。此外,样本数据、预期结果和逻辑解释也会有所帮助。还可以解释为什么问题被标记为不再受支持的数据库。您应该使用受支持的SQL Server版本。您还应该添加一些说明,说明您所做的更改,以及这将加快查询速度的原因。。。。。。。不要在没有任何解释的情况下把一堆代码扔给我们!!
SELECT TOP (1)
       @PeriodStart = DATEADD(SECOND, 1, dbo.tbl_WPT_AttendanceLog.ATDateTime)
FROM dbo.tbl_WPT_EmployeeMachineLink
    INNER JOIN dbo.tbl_WPT_Machine
        ON dbo.tbl_WPT_EmployeeMachineLink.FK_tbl_WPT_Machine_ID = dbo.tbl_WPT_Machine.ID
    RIGHT OUTER JOIN dbo.tbl_WPT_AttendanceLog
        ON dbo.tbl_WPT_EmployeeMachineLink.FK_tbl_WPT_Machine_ID = dbo.tbl_WPT_AttendanceLog.FK_tbl_WPT_Machine_ID
           AND dbo.tbl_WPT_EmployeeMachineLink.MachineEnrollmentNo = dbo.tbl_WPT_AttendanceLog.ATEnrollmentNo
WHERE dbo.tbl_WPT_AttendanceLog.FK_tbl_WPT_Employee_ID = @EmpID
      AND dbo.tbl_WPT_AttendanceLog.ATInOutMode IN ( 1, 2, 5 )
      AND
      (
          dbo.tbl_WPT_AttendanceLog.ATDateTime
      BETWEEN @ShiftEndPreviousInstance AND @ShiftStart
          OR dbo.tbl_WPT_AttendanceLog.ATDateTime
      BETWEEN @ShiftEndPreviousInstance AND @ShiftStart
      )
ORDER BY dbo.tbl_WPT_AttendanceLog.ATDateTime DESC;