为什么长时间运行的SQL命令不返回任何数据,从而产生100个MB的网络流量

时间:2017-12-20 21:19:49

标签: c# sql-server

考虑我正在针对远程服务器执行的下面的设想示例。命令本身不返回任何数据但是当我在Process Explorer中观察进程时,我可以看到我通过网络接收大量数据 - 下面的示例我收到了~370 MB。在数据库服务器上查看Process Explorer我可以看到一个网络活动图,它与我的客户端计算机上的网络活动图完全匹配,但是这个图用于发送数据。

造成这种情况的原因是什么?如何预防?

var query = @"
    declare @Value nvarchar(max), @index int
    set @index = 0

    while @index < 10000000
    begin
        set @Value = 'this is just a test'
        set @index = @index + 1
    end";

var connectionString = "MyConnectionString";

using (var connection = new SqlConnection(connectionString))
using (var command = connection.CreateCommand())
{
    connection.Open();

    command.CommandTimeout = 0;
    command.CommandText = query;
    command.ExecuteNonQuery();
}

1 个答案:

答案 0 :(得分:4)

对于批处理中的每个SQL语句,SQL以DONE token响应。每个令牌都是13个字节。

循环的每次迭代表示3个语句(2个set语句和循环条件结构本身)。 3 * 13字节* 10,000,000 = 390 MB。

您可以使用SET NOCOUNT ON(谢谢,Scott)来避免这种情况。