执行返回> 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())
{
}
}
}
答案 0 :(得分:1)
为什么它没有显示在你的进程内存中我无法回答。但基本上,一旦查询开始产生结果,服务器就会以 1,2 的速度将它们发送到客户端。可能涉及各种级别的缓冲,其中一些(例如网络驱动程序内的缓冲区)将不会在您的过程中直接计算。
一旦交付完所有结果,服务器可以尽快释放查询所需的资源,并开始使用它们来满足其他查询(对于其他客户端)。
只有一个结果存储在客户端上,并要求每次调用Read
从服务器中提取一个新行,每次都需要进行一次网络往返。非常低效。< / p>
1 受到例如任何限制的约束。 TCP窗口。
2 通常被称为&#34; firehose模式&#34;,而不是您为查询显式创建游标,您可以在其中控制从服务器检索的速率。