Sql 如何优化查询以减少执行时间
我的查询的order by子句和datetime比较导致执行时间增加,正如我为datetime编制索引一样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
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;