2010-11-13 59 views
0

当我运行一个从Sql管理工具中返回数百万行的查询时,它看起来像查询立即执行。据我所知,几乎没有执行时间。什么使查询花费时间完成是返回所有行。 这让我觉得我做得很好!但速度并不快......当我在分析器工具中查看查询时,它指出查询使用了7600 CPU。持续时间为15000.如何将执行时间与运行和返回行所花费的总时间区分开来?

我不知道我知道如何解释这些统计。 一方面,查询似乎运行得很快,但探查器报告让我觉得不然。如何在Mgmt Tools中立即执行查询?据我所知,显然应该有某种延迟执行:至少7600毫秒。当我在mgmt工具中运行查询以完成查询时,我必须等待比CPU和持续时间统计更长的时间。

回答

3

它看起来像查询立即执行 这可能是查询计划允许开始快速返回行。
例如,如果您执行SELECT * FROM a_large_table,您将立即看到一些行,但检索整个结果集需要一些时间。 Mgmt Studio报告的实际执行时间是多少(查询完成后显示在状态栏中)?

如果要在不向客户端检索数据的情况下测试查询性能,可以执行SELECT INTO #temp_table。这将需要一些额外的I/O,但仍会给你一个相当好的执行时间估计。

UPD。
你也可以运行诸如SELECT COUNT(*) FROM (<your query here>)SELECT SUM(<some field>) FROM (<your query here>)之类的东西 - 运气好的话,它会使服务器执行查询并聚合结果,基本上做同样的工作再加上一点额外的东西。但以这种方式扭曲结果是非常容易的 - 查询优化器很聪明,并且需要非常小心以确保测量您想要测量的结果(因为使用不同的执行计划来测量查询根本没有意义)。

我建议你再考虑一下你想测量什么以及为什么。在任何真实场景中,对“纯”查询持续时间不感兴趣 - 因为您永远不想丢弃查询结果(结果就是您为什么首先需要查询,对吧?)。因此,您需要将结果返回给客户端,或者将其存储在某个地方,或者将其与另一个表等结合起来 - 通常您需要测量查询执行情况,包括处理结果的时间。

最后一个通知。如果你希望你能以某种方式迫使服务器在1秒内执行这个查询,因为你认为服务器在其他13秒内什么都不做,你错了。就像他们说的那样,SELECT没有被破坏。
有什么可以帮助查询优化 - 对于单个查询分析器不会帮你太多。分析查询计划,调整您的表结构,尝试重写查询,如果遇到麻烦,请在SO上发布另一个问题。

+0

管理工具报告查询花了14秒,但正如我所说我可以立即滚动reults视图。有没有其他方法可以测试这个,而不写入临时表? – 2010-11-19 18:11:23

+0

这绝对意味着整个查询需要14秒,但您看到的行会更快地返回。如果不查看查询计划和数据,很难详细解释这一点,但这种行为绝不意外。 – VladV 2010-11-20 21:10:57

+2

为避免混淆“SELECT INTO”或向查询添加假集合,SSMS中有一个选项“执行后放弃结果” – 2010-11-20 21:35:09

相关问题