.net - SQL Server 和 SqlDataReader - 万亿条记录 - 内存

标签 .net sql-server ado.net sqldatareader datareader

我从未尝试过这个 - 所以我不知道是否会遇到内存问题。

但是 SqlDataReader 可以读取一万亿条记录吗?一切都正确传输了吗?我对 SQL/TDS 协议(protocol)在幕后所做的事情还不太了解。

更新 将万亿翻译为非常大的数字。我可能应该说 10 亿或 1 亿之类的。

最佳答案

有一些细节。

  • SqlDataReader 通常会读取内存中的整行并将其缓存。这包括任何 BLOB 字段,因此您最终可以在内存中缓存多个 2GB 字段(XML、VARBINARY(MAX)、VARCHAR(MAX)、NVARCHAR(MAX))。如果这些字段是一个问题,那么您必须传入 CommandBehavior.SequentialAccessExecuteReader并使用 SqlClient 特定类型的流功能,如 SqlBytes.Stream .

  • 连接处于繁忙状态,直到 SqlDataReader 完成为止。这会产生事务问题,因为您将无法在同一事务中对数据库进行任何处理,因为连接很忙。尝试打开不同的连接并注册同一事务将会失败,因为环回分布式事务是被禁止的。解决方法是使用 MARS 。您可以通过设置MultipleActiveResultSets=True来做到这一点在连接上。这允许您在数据读取器仍处于事件状态时在同一连接上发出命令(典型的获取-处理-获取循环)。请仔细阅读 Christian Kleinerman 的链接,确保您了解有关 MARS 和交易的问题和限制,它们非常微妙且违反直觉。

  • 客户端中的冗长处理将阻塞服务器。您的查询仍将一直执行,当通信管道填满时,服务器将不得不暂停它。一个查询消耗 worker (或者更多,如果它有并行计划)并且工作是服务器中非常稀缺的商品(它们大致相当于线程)。 您无法让许多客户随意处理庞大的结果集。

  • 交易规模。在一笔交易中处理一万亿条记录是行不通的。日志必须增长以容纳整个事务,并且不会截断和重用VLF,从而导致巨大日志增长。

  • 恢复时间。如果在第 9990 亿条记录处处理失败,则必须回滚所有已完成的工作,因此回滚还需要“12”天。

关于.net - SQL Server 和 SqlDataReader - 万亿条记录 - 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1849144/

相关文章:

unit-testing - MSTest.exe 无法加载 ADO.NET 数据提供程序?

c# - 为什么此应用程序要查找引用程序集的旧版本、已删除版本?

c# - NuGet 包 : how to add references to webservices?

mysql - SQL : Order by column, 然后通过子字符串混合 asc 和 desc

sql-server - 使用 T-SQL FOR XML PATH 删除空的 XML 节点

c# - 如何为包含数据库连接器的程序集设置绝对路径?带有 Entity Framework 4.1 的 MySQL 连接器 6.4.3

oracle - 如何使用 Windows 身份验证将 System.Data.OracleClient 连接到 oracle db?

MySql Null DateTime 和 MS.net 表现不佳

c# - 如何使用 Aspose 加速工作簿创建?

sql-server - SQL SERVER 作业未执行 SSIS