【发布时间】:2020-10-16 04:11:02
【问题描述】:
实际上我不确定标题是否准确地描述了这个问题,但我希望它足够接近。
我有一些代码从数据库表中执行 SELECT,我知道这将导致大约 150 万行被选中。每行中的数据并不大 - 每行可能 20 个字节。但这仍然是 30MB 的数据。每行包含一个客户编号,我需要对每个客户做一些事情。
我的代码如下所示:
SqlConnection conn = new SqlConnection(connString);
SqlCommand command = new SqlCommand("SELECT ... my select goes here", conn);
using (conn)
{
conn.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
... process the customer number here
}
}
}
所以我只遍历 SELECT 返回的所有客户。
我的问题是,这会导致对数据库的多次读取,还是只读取一次?我假设网络缓冲区不足以容纳 30MB 的数据,那么 .NET 在这里做了什么?每次 Read() 推进指针时,SELECT 的结果是否被隐藏在某个地方,以便 SQLDataReader 蚕食一行?还是返回数据库?
我问的原因是代码的“...在此处处理客户编号”部分可能需要一些时间,因此对于 150 万客户而言,该代码(上面的 while 循环)将需要很多小时才能完成.当这种情况发生时,我是否需要担心其他人在数据库中阻止我,或者我知道我已经从数据库中完成了我的一次 SELECT 并且我不会再回去了,我是否安全?
【问题讨论】:
-
所以您有 2 个问题? => 数据读取器如何工作以及它将如何影响我的查询和/或数据库上的其他用户
-
在处理像这样的大量数据时,有时谨慎地更改代码的工作方式。对客户进行了哪些处理?在退货之前,是否可以使用其他条件排除任何客户?
-
@Schuere 好吧,是的,我想。后者是为了挠我眼前的痒,前者是为了通知我以后的事情。我将如何将它们分开?
-
@JeffR,与我们分享你想对 150 万客户做什么的过程,也许有更好的选择,比如 SPROCS