如何在SQL Server中快速进行此TOP查询?

时间:2018-09-19 09:13:45

标签: sql-server query-performance

这是我的查询

 SELECT top 1 w.WONumber, * FROM TSP_TSR_Job t  left join
 wsm_WorkOrderSchedule w on w.tsrjobid = t.JobId WHERE t.JobID=325809

执行计划: enter image description here

我尝试过的事情:

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 

执行计划: enter image description here 问题是两个查询都花了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.

2 个答案:

答案 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的文本输出并进行解析。通过表,您可以很好地直观了解您的时间和其他资源使用情况。