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

2023-11-27

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

但是 SqlDataReader 可以读取一万亿条记录吗?全部都正确传输了吗?我对 SQL/TDS 协议的幕后功能还不太了解。

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


有几个细节。

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

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

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

  • 交易规模。在一笔交易中处理一万亿条记录是行不通的。日志必须增长以适应entire事务并且不会截断和重用 VLF,从而导致huge对数增长。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 和 SqlDataReader - 万亿条记录 - 内存 的相关文章

随机推荐