SQL Server的查询性能取决于客户端的网络速度吗?

时间:2011-02-17 20:16:53

标签: sql-server performance

当我从远程桌面连接到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用于远程连接。我试过命名管道,它甚至更慢。我认为如果查询执行不涉及将数据返回到客户端,它不应该依赖于网络连接或使用的协议,但显然它确实如此。

任何想法为什么?你能验证我的结果吗?

2 个答案:

答案 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慢。