当我从远程桌面连接到SQL Server框并从那里打开Management Studio时,我的测试查询运行得比从远程工作站使用Management Studio连接时更快。问题是:为什么?!
我的查询不会返回任何数据。这是我的查询的确切文本:
set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls off
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
exec dbo.Test
测试定义如下:
CREATE PROCEDURE dbo.Test
AS
BEGIN
declare @cnt int = 0
declare @d as datetime
set @d = dateadd(ss,5,GETDATE());
WHILE GETDATE() < @d
BEGIN
SET @cnt = @cnt + 1
END
print @cnt
END
两个查询都需要5秒才能执行,但本地运行返回的值比远程运行的值大7倍。
查看分析器,LPC协议在本地使用,而TCP / IP用于远程连接。我试过命名管道,它甚至更慢。我认为如果查询执行不涉及将数据返回到客户端,它不应该依赖于网络连接或使用的协议,但显然它确实如此。
任何想法为什么?你能验证我的结果吗?
答案 0 :(得分:4)
每次调用SET
命令时都会向客户端发送反馈。
如果您更改代码如下所示,性能会更好(甚至是本地)。我得到大约900万个循环,而1400个循环得到SET NOCOUNT ON
。作为一般规则,您应始终将SET NOCOUNT切换为on作为存储过程的第一个语句。
CREATE PROCEDURE dbo.Test
AS
BEGIN
SET NOCOUNT ON
declare @cnt int = 0
declare @d as datetime
set @d = dateadd(ss,5,GETDATE());
WHILE GETDATE() < @d
BEGIN
SET @cnt = @cnt + 1
END
print @cnt
END
SET NOCOUNT ON
消除了为存储过程中的每个语句向客户端发送DONE_IN_PROC消息。有关DONE_IN_PROC的更多信息,请访问on MSDN
答案 1 :(得分:1)
即使没有要返回的数据,Management Studio在运行查询时也会与SQL Server实例进行“对话”。在服务器上作为应用程序运行SQLMS实际上总是会导致更快的执行时间,因为当您远程访问终端服务(RDP)时,网络仅用于GUI消息。当您在本地运行SQLMS实例并将其连接到远程服务器时,客户端和服务器之间的“对话”(涉及比UI消息更多的数据)通过LAN进行,这保证比LPC慢。