加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 为什么执行语句的速度取决于网络连接?

发布时间:2021-01-03 16:24:30 所属栏目:编程 来源:网络整理
导读:看起来执行T-SQL的速率取决于收集毗连对处事器的耽误.我假设假如SQL Server没有任何内容可以向客户陈诉,它只会执行,直到完成但测试表现另一个故事. create procedure UselessLoop @I intasdeclare @D datetime = getdate()while @I 0 set @I -= 1print datedi

看起来执行T-SQL的速率取决于收集毗连对处事器的耽误.我假设假如SQL Server没有任何内容可以向客户陈诉,它只会执行,直到完成但测试表现另一个故事.

create procedure UselessLoop
  @I int
as
declare @D datetime = getdate()
while @I > 0 set @I -= 1
print datediff(millisecond,@D,getdate())

exec UselessLoop 100000

Server    Milliseconds
local     53
nearby    63
faraway   660

exec UselessLoop 1000000

Server    Milliseconds
local     546
nearby    640
faraway   6183

行使SSMS从差异计较机对统一处事器执行测试.当地从处事器执行,四面是在统一个当地收集上,远处是500公里外的另一个办公室,用1千兆光纤毗连.

SQL Server和客户端之间显然存在一些直接依靠于执行的语句数目的通讯.

我行使Wireshark来查察传输的内容,我不能说我领略那么多,但它是一个tcp.stream,在22740个数据包中互换总共26 MB.

一个无用的成果呢?

create function dbo.UDFUselessLoop(@I int)
returns int
as
begin
  declare @D datetime = getdate()
  while @I > 0 set @I -= 1
  return datediff(millisecond,getdate())
end

print dbo.UDFUselessLoop(1000000)

无论从那里执行,它城市在406毫秒内执行.看起来轮回中没有与客户端的通讯.

办理要领

There is obviously some communication going on between SQL Server and the client that directly is dependent on the number of statements executed.

就在这里.默认环境下,SQL Server在存储进程中的每个语句之后发送一个TDS DONE_IN_PROC message.该动静将完成的语句的状态和行计数信息转达给客户端.

您可以行使T-SQL呼吁榨取发送这些动静:

SET NOCOUNT ON;

以下是此呼吁从the Books Online entry开始的摘录(我的重点):

For stored procedures that contain several statements that do not return much actual data,or for procedures that contain Transact-SQL loops,setting SET NOCOUNT to ON can provide a significant performance boost,because network traffic is greatly reduced.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读