如何在不输出数据的情况下测试Sql Server Mgmt Studio中的性能?

时间:2009-08-06 16:29:07

标签: sql-server database-performance

使用SQL Server Management Studio。

如何在没有结果窗口影响我的测试的情况下测试大型选择(比如600k行)的性能?所有事情都是平等的并不重要,因为两个查询都会输出到同一个地方。但我想加快我的测试周期,我认为SQL Server Management Studio的输出设置正在阻碍我。输出到文本是我目前使用的,但我希望有更好的选择。

我认为这会影响我的号码,因为数据库在我的本地方框上。

编辑:有一个关于在这里做WHERE 1 = 0的问题(认为连接会发生但没有输出),但我测试了它并且它不起作用 - 不是查询性能的有效指标。

7 个答案:

答案 0 :(得分:10)

您可以在查询之前执行SET ROWCOUNT 1。我不确定它是你想要的,但它可以避免等待返回大量数据,从而为您提供准确的计算成本。

但是,如果您add Client Statistics to your query,其中一个数字是服务器回复的等待时间,这将为您提供服务器计算时间,不包括通过网络传输数据所需的时间。

答案 1 :(得分:2)

您可以SET STATISTICS TIME ON来衡量服务器上的时间。您可以使用SSMS上的查询/ Include Client Statistics(Shift + Alt + S)来获取有关客户端时间使用情况的详细信息。请注意,SQL查询不会运行,然后在完成时将结果返回给客户端,而是以作为运行它们返回结果,甚至在通信通道已满时暂停执行。

查询完全忽略将结果数据包发送回客户端的唯一上下文是激活。但是,在衡量绩效时,还应考虑将输出返回客户端的时间。你确定你自己的客户会比SSMS更快吗?

答案 2 :(得分:1)

如果不输出结果,如何测试查询的性能?如果测试没有告诉您有关查询将如何执行的任何信息,那么加速测试是毫无意义的。你是否真的想要找出这条查询的狗需要十分钟才能将数据推送到prod之后?

当然,要花费一些时间才能返回600,000条记录。它也将在您的用户界面中,它可能需要比查询窗口更长的时间,因为信息必须通过网络。

答案 3 :(得分:1)

SET ROWCOUNT 1将在返回第一行后停止处理,这意味着除非计划恰好有阻塞运算符,否则结果将毫无用处。

采取一个简单的例子

SELECT * FROM TableX

此查询的实际成本在很大程度上取决于TableX中的行数。

使用SET ROWCOUNT 1不会显示任何内容。无论TableX是否有1行或10亿行,它都将在返回第一行后停止执行。

我经常将SELECT结果分配给变量,以便能够查看逻辑读取等内容,而不会因显示结果的SSMS而减慢速度。

  SET STATISTICS IO ON
  DECLARE @name nvarchar(35),
          @type nchar(3)

  SELECT @name = name, 
         @type = type
  FROM master..spt_values

有一个相关的Connect Item请求Provide "Discard results at server" option in SSMS and/or TSQL

答案 4 :(得分:0)

您可以做的最好的事情是检查实际查询的查询执行计划(按 Ctrl + L )。这将为您提供最佳的性能猜测。

答案 5 :(得分:0)

我认为WHERE 1=0的where子句肯定发生在SQL Server端,而不是Management Studio。不会返回任何结果。

您是否在运行Mgmt Studio的同一台计算机上使用数据库引擎?

你可以:

  • 输出到文字或
  • 输出到文件。
  • 关闭“查询结果”窗格。

这只会改变在Mgmt Studio中绘制网格所花费的周期。也许Resuls to Text在整体上会更有效。隐藏窗格会在Mgmt Studio上保存必须绘制数据的周期。它仍然被归还给Mgmt Studio,所以它实际上并没有节省很多周期。

答案 6 :(得分:0)

有很多更正确的答案,但我认为真正的问题是我偶然发现这个问题时刚刚问自己的问题: 我在同一个测试数据上有一个查询 A 和一个查询 B。哪个更快?我想检查又快又脏。对我来说,答案是 - 临时表(这里创建临时表的开销很容易忽略)。这只能在 perf/testing/dev 服务器上完成!

查询 A:

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS (to clear statistics
SELECT * INTO #temp1 FROM ...

查询 B

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SELECT * INTO #temp2 FROM ...