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