7

使用 SQL Server 管理工作室。

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

我认为这会影响我的数字,因为数据库在我的本地盒子上。

编辑:有一个关于在此处执行 WHERE 1=0 的问题(认为会发生连接但没有输出),但我对其进行了测试,但它不起作用——这不是查询性能的有效指标。

4

7 回答 7

11

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

但是,如果您将 Client Statistics 添加到您的查询中,其中一个数字是 Wait time on server replies,这将为您提供服务器计算时间,不包括通过网络传输数据所花费的时间。

于 2009-08-06T16:50:34.183 回答
3

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

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

于 2009-08-06T17:10:35.580 回答
1

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

举个简单的例子

SELECT * FROM TableX

实际上,此查询的成本将在很大程度上取决于TableX.

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

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

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

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

在 SSMS 和/或 TSQL 中有一个相关的连接项目请求提供“在服务器上丢弃结果”选项

于 2012-03-13T13:25:43.053 回答
0

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

于 2009-08-06T16:33:38.993 回答
0

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

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

你可以 :

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

这只会移动在 Mgmt Studio 中绘制网格所花费的周期。总体而言,文本的结果可能会更好。隐藏窗格将节省 Mgmt Studio 上必须绘制数据的周期。它仍在返回到 Mgmt Studio,因此它确实没有节省很多周期。

于 2009-08-06T16:34:37.057 回答
0

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

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

于 2009-08-06T18:40:19.687 回答
0

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

查询一:

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

查询 B

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SELECT * INTO #temp2 FROM ...
于 2021-04-30T09:27:26.143 回答