代码之家  ›  专栏  ›  技术社区  ›  Adam Asham

如何区分执行时间和运行和返回行所花费的总时间?

  •  0
  • Adam Asham  · 技术社区  · 15 年前

    当我运行一个从SQL管理工具中返回数百万行的查询时,它看起来像是立即执行的查询。据我所知,实际上没有执行时间。使查询需要时间完成的是返回所有行。 这让我觉得我做得很好!但不是那么快…当我在探查器工具中查看查询时,它指出查询使用了7600 CPU。持续时间为15000。

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   VladV    15 年前

    看起来查询立即执行 可能是查询计划允许快速返回行。
    例如,如果你这样做 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秒内什么也不做,那么您是错的。正如他们所说,selectain't break。
    可能有帮助的是查询优化——对于单个查询,探查器不会对您有太多帮助。分析查询计划,调整表结构,尝试重写查询,如果遇到问题,在so_上发布另一个问题。