Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 如何理解执行计划中每个步骤花费的时间?_Sql Server - Fatal编程技术网

Sql server 如何理解执行计划中每个步骤花费的时间?

Sql server 如何理解执行计划中每个步骤花费的时间?,sql-server,Sql Server,我正在使用SQL Server执行计划分析我的SQL语句执行时间。但我无法计算出计划结果中每一步所花费的时间。看起来结果对我来说毫无意义 在我的查询中,我启用了以下选项: SET STATISTICS TIME ON SET STATISTICS PROFILE ON 我运行包含实际执行计划的执行计划。以下是屏幕截图结果: 计划图上列出了一些步骤,我可以通过单击它们查看每个步骤的执行时间,并读取右侧属性面板上的实际时间统计信息,如下所示: 在消息输出中,我可以看到查询的总时间: SQL S

我正在使用SQL Server
执行计划
分析我的SQL语句执行时间。但我无法计算出计划结果中每一步所花费的时间。看起来结果对我来说毫无意义

在我的查询中,我启用了以下选项:

SET STATISTICS TIME ON
SET STATISTICS PROFILE ON
我运行包含
实际执行计划的执行计划。以下是屏幕截图结果:

计划图上列出了一些步骤,我可以通过单击它们查看每个步骤的执行时间,并读取右侧属性面板上的
实际时间统计信息,如下所示:

在消息输出中,我可以看到查询的总时间:

SQL Server Execution Times:
   CPU time = 47 ms,  elapsed time = 331 ms.
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.

您可以看到,总共需要331ms,但每一步花费的时间非常少,其中最大的一步为14ms,其他大部分为0。执行计划结果的总运行时间远小于331ms。我怎么能理解时间的流逝?如果没有这些,我就无法找出sql语句中的瓶颈是什么执行时间:sql server完成编译计划的执行所花费的总时间

CPU时间
:在CPU上花费的实际时间。如果
CPU时间
为0,则表示直接从
缓存计划
获取查询。 如果查询是
编译
重新编译
,则CPU使用率和
CPU时间将更高。
还有其他因素也会影响CPU时间

经过时间
:完成解析和编译所花费的总时间,包括将结果提交给客户端所花费的时间

这两个都是需要理解的重要内容。如果我希望快速向客户机显示结果非常重要,那么我可以忽略
CPU时间
。 因此在这种情况下,
经过时间
CPU时间
重要

在另一种情况下,我可以忽略稍高的
流逝时间
,集中精力减少高
CPU时间

如果没有这些,我就无法找出sql中的瓶颈是什么 声明

执行时间(CPU+运行时间)
本身不是瓶颈。它只是一个指标。 这是不可取的,然后您必须调查哪个
操作员是瓶颈
并采取适当的行动

比如编写
优化查询
索引调优
或更改表模式或其他一些东西

根据您的查询计划,
哈希匹配
被认为是最昂贵的运算符。 您的主查询不可见

你也可以这样看

为什么每个计划花费的总时间远远少于所用时间 从消息输出窗口报告的时间是331ms

假设您有一个非常简单的查询,比如

Select * from Person.Person
在这种情况下,每个操作员在其右侧操作员停止执行后开始执行。从理论上讲,

Total Elapse Time is sum of each operator Elapse Time.
如果直接从查询计划执行查询,或者经过的时间太小,则将其舍入为0。但理论上,
总经过时间是每个运算符经过时间的总和

现在,以任何复杂的查询为例,一个或多个操作符开始同时执行,然后合并为一个,最终经过的时间可能不同

您的主要查询计划不完全可见,否则我会尝试解释我的意思

如果您使用的是
Sql server 2016
或更高版本,则可以查看数据的流动情况以及多个操作员如何协同工作


即使您没有Sql server 2016,您仍然可以理解实际情况。

索引查找是IO密集型的,连接、计算、聚合和排序是CPU密集型的,不会占用太多CPU。表中必须有大量数据。通常经过的时间等于CPU+IO时间。IO可以是用于读/写的磁盘/网络访问。你们有什么样的磁盘?普通HDD、SSD或SAN?我有SDD。我试图找出每一步需要花费多少时间。我可以从explain中阅读这些信息吗?目的是提高查询的性能吗?如果是这样,只需使用实际计划中的百分比金额,尝试隔离性能问题。此外,使用实际与估计的rowsIt不仅仅是为了提高性能。更重要的是,我想知道在执行计划的每个步骤上花费的时间。百分比没有告诉我时间。@ZhaoYi,因为没关系。查询是IO密集型的。重要的是百分比和实际IO统计信息,例如估计的行数与实际行数、逻辑读取、内存授予等。实际毫秒数并不重要,尤其是在并行查询中。通过查看CPU时间,您不会发现瓶颈。感谢您的回复。我想知道如何才能得到执行计划中每个步骤的经过时间?@ZhaoYi,右键单击执行计划-->属性-->实际统计时间中的每个操作符。你是说“实际统计时间”对吗?我已经查过了。问题是为什么每个计划花费的总时间远小于消息输出窗口报告的331ms的
运行时间
。@ZhaoYi,对不起,我没有回答主要问题。您可以阅读我编辑的。