2014-01-28 27 views
1

我正在使用SQL Server 2012和SET STATISTICS TIME ON来测量我的sql语句的CPU时间。我使用这个,因为我只想获得数据库需要执行语句的时间。了解Sql Server执行时间

当从select返回大数据时,我注意到CPU时间上升很高,就像使用TOP 2000将需要大约400ms,但没有它将需要大约10000ms的CPU时间。

什么我不知道的是: 是否有可能将占用CPU的时间我得到恢复包括像它需要排在我Sql Server Management Studio返回显示数以百万计的时间?这将是一个很糟糕的情况。

更新:

我想收到的时间是在SQL Server的不显示的行所需SSMS的时间执行时间。在Client statistics中有几个时间统计显示,但经过很长时间的搜索后,很难找到解释它们的好参考。有什么建议么?

理念:经过时间(SQL Server的执行时间)- 客户端的处理时间(客户端统计)

这也许是一种选择?

+0

'TOP X'不需要对整个查询进行所有数据评估,然后丢弃所有不必要的行。较低的CPU成本是因为只有生成2000结果行所需的数据正在处理中。如果你真的有意识地向自己证明;查看实际的执行计划,和/或尝试将结果插入临时表(结果中没有网络流量,尽管仍有潜在的磁盘IO)。 – MatBailie

+0

你的表中是否有〜50k记录? –

+0

我得到了约100k行 – stb

回答

1

在多线程世界中,CPU时间对简单调整的帮助越来越小。执行时间值得关注。

要查看执行时间(经过时间)是否包含在显示结果上,您可以使用SELECT TOP 2000 * INTO #temp来比较执行时间。

更新:

我的快速测试显示创建/插入一个#temp表远远超过在显示结果的(5000)的开销。当我查看50,000条结果时,SELECT INTO运行得更快。两者相等的数量取决于返回的字段数量和类型。我测试:在SET STATISTICS TIME ON

SET STATISTICS TIME ON 
SELECT TOP 50000 NEWID() 
FROM master..spt_values v1, master..spt_values v2 
WHERE v1.number > 100 
SET STATISTICS TIME OFF 
-- CPU time = 32 ms, elapsed time = 121 ms. 


SET STATISTICS TIME ON 
SELECT TOP 50000 NEWID() col1 
INTO #test 
FROM master..spt_values v1, master..spt_values v2 
WHERE v1.number > 100 
SET STATISTICS TIME OFF 
-- CPU time = 15 ms, elapsed time = 87 ms. 
+0

谢谢,我认为这是要走的路。但不是'进入#temp'再次产生执行时间吗? – stb

+0

@stb我刚刚测试过,是的,只有2000个结果,创建/插入的开销大于返回结果的开销。查看更新。 –

+0

我们应该能够限制在ssms中显示的行,所以这不会发生。 – stb

0

CPU时间仅计算的SQL Server需要执行查询的时间。它不包括客户用来呈现结果的任何时间。它也排除了SQL Server花费等待缓冲区清除的任何时间。总之,它确实相当独立于客户端。

+0

问题CPU时间是它花费在所有CPU上的总时间。像2000ms的CPU时间和4个CPU可能需要500ms(2000/4)或最有可能的500毫秒和1000毫秒之间,因为CPU不能同时工作。我认为这是不可能得到我想要的 – stb