这是我的查询
SELECT top 1 w.WONumber, * FROM TSP_TSR_Job t left join
wsm_WorkOrderSchedule w on w.tsrjobid = t.JobId WHERE t.JobID=325809
我尝试过的事情:
DECLARE @i INT
SET @i=1
SELECT TOP (@i) ObjectType='Job',w.WONumber,*
FROM TSP_TSR_Job t
left HASH join wsm_WorkOrderSchedule w
on w.tsrjobid = t.JobId
WHERE t.JobID=325809
执行计划:
问题是两个查询都花了0:0:1秒。
wsm_WorkOrderSchedule中的2493073行和TSP_TSR_Job中的524444
brentozar.com/pastetheplan/?id=ByXUickKQ执行计划
> SQL Server parse and compile time: CPU time = 0 ms, elapsed time =
> 0 ms.
>
> SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
> Warning: The join order has been enforced because a local join hint is
> used. SQL Server parse and compile time: CPU time = 5 ms, elapsed
> time = 5 ms.
>
> (1 row(s) affected) Table 'Workfile'. Scan count 0, logical reads 0,
> physical reads 0, read-ahead reads 0, lob logical reads 0, lob
> physical reads 0, lob read-ahead reads 0. Table 'Worktable'. Scan
> count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob
> logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table
> 'wsm_WorkOrderSchedule'. Scan count 1, logical reads 6, physical reads
> 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob
> read-ahead reads 0. Table 'TSP_TSR_Job'. Scan count 0, logical reads
> 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
> physical reads 0, lob read-ahead reads 0.
>
> (1 row(s) affected)
>
> SQL Server Execution Times: CPU time = 16 ms, elapsed time = 11
> ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed
> time = 1 ms.
>
> SQL Server Execution Times: CPU time = 1 ms, elapsed time = 1 ms.
答案 0 :(得分:1)
首先,创建索引以删除聚集索引扫描:
CREATE NONCLUSTERED INDEX IX_wsm_WorkOrderSchedule_tsrjobid
ON wsm_WorkOrderSchedule (tsrjobid)
INCLUDE (WONumber);
此外,更改您的TSP_TSR_JobId
索引以包含列。查看关键查找运算符以找出需要哪些列
答案 1 :(得分:1)
我建议您在4.8
(看来好像有)上添加非聚集索引:
4.10+
通过添加此索引,您将获得针对特定查询的最佳执行计划(您似乎真的确实需要所有列,如您所说)
现在,您的期望是查询所用的时间应少于1秒(此时您认为这样做)。
但是实际上,通过查看wsm_WorkOrderSchedule
输出中的信息,您的查询只需执行大约18ms即可(并且有一个重要的区别)。
您大概在屏幕右下角的[SQL Server Management Studio]中看到的1秒钟之内的剩余时间,实际上是数据通过网络传输所需的时间,供SSMS渲染。
编辑:
如果您对我想出的18ms位置感到好奇,可以很容易地转到statisticsparser.com,然后在其中输入STATISTICS TIME和IO的文本输出并进行解析。通过表,您可以很好地直观了解您的时间和其他资源使用情况。