使用SQL Server Management Studio。
如何在没有结果窗口影响我的测试的情况下测试大型选择(比如600k行)的性能?所有事情都是平等的并不重要,因为两个查询都会输出到同一个地方。但我想加快我的测试周期,我认为SQL Server Management Studio的输出设置正在阻碍我。输出到文本是我目前使用的,但我希望有更好的选择。
我认为这会影响我的号码,因为数据库在我的本地方框上。
编辑:有一个关于在这里做WHERE 1 = 0的问题(认为连接会发生但没有输出),但我测试了它并且它不起作用 - 不是查询性能的有效指标。
答案 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 ...