gpt4 book ai didi

c# - SQLDataReader 如何处理非常大的查询?

转载 作者:可可西里 更新时间:2023-11-01 09:10:06 24 4
gpt4 key购买 nike

实际上我不确定标题是否准确描述了问题,但我希望它足够接近。

我有一些代码从数据库表中执行 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 在这里做什么呢? SELECT 的结果是否存储在某个地方以便 SQLDataReader 每次 Read() 推进指针时蚕食一行?还是返回数据库?

我问的原因是代码的“...在这里处理客户编号”部分可能需要一些时间,因此对于 150 万客户来说,该代码(上面的 while 循环)将需要很多小时才能完成.当发生这种情况时,我是否需要担心其他人在我身后阻止我访问数据库,或者我知道我已经从数据库中完成了一次 SELECT 并且我不会再返回是否安全?

最佳答案

选择将作为“单个整体事务”执行。输出的余额缓存在 SQL Server 中,并在协议(protocol)确定有缓冲区可用于接收它时传递到网络。不过,SQL Server 不会每次都返回数据表。原始 SELECT 传递时的数据状态将返回到您的应用程序。如果您指定了 (NOLOCK),您将不会对数据产生进一步的影响。其他人可以读写;你不会看到他们的变化。然而,直到几小时后最后一行出现在应用程序服务器的缓冲区中,您才算完成了 SQL Server 的使用。每次“我现在有更多空间了,拜托”时都会有网络流量,但不会比一次处理全部 30MB 多多少。

对于大型结果集和长时间运行的进程,您最好编写应用程序来批量处理数据,即使基础架构可以支持完整的查询输出。回答每个批处理查询所需的资源更少。如果失败,您只需要处理剩余的行;您不必从头开始。您的应用程序最终会完成更多的整体工作,但每个 block 对环境的破坏性较小。

关于c# - SQLDataReader 如何处理非常大的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23467482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com