SqlCommand.ExecuteReader()如何工作?

时间:2018-03-22 12:38:57

标签: c# sql

执行返回> 1000万行的sqlText后,我的传入带宽开始增加,但我的进程内存保持一致。我确信传入的带宽来自这个过程。这对我来说没有意义,因为executeReader应该只在reader对象中存储一行。我认为调用reader.read()实际上会检索数据。为什么我的传入带宽会上升?

using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandTimeout = 0;
            command.CommandText = sqlText;
            using (SqlDataReader reader = command.ExecuteReader())
            {
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

为什么它没有显示在你的进程内存中我无法回答。但基本上,一旦查询开始产生结果,服务器就会以 1,2 的速度将它们发送到客户端。可能涉及各种级别的缓冲,其中一些(例如网络驱动程序内的缓冲区)将不会在您的过程中直接计算。

一旦交付完所有结果,服务器可以尽快释放查询所需的资源,并开始使用它们来满足其他查询(对于其他客户端)。

只有一个结果存储在客户端上,并要求每次调用Read从服务器中提取一个新行,每次都需要进行一次网络往返。非常低效。< / p>

1 受到例如任何限制的约束。 TCP窗口。

2 通常被称为&#34; firehose模式&#34;,而不是您为查询显式创建游标,您可以在其中控制从服务器检索的速率。