【问题标题】:Get more than million rows from SQL Server table从 SQL Server 表中获取超过百万行
【发布时间】:2020-05-03 22:20:39
【问题描述】:

过去,我在将超过一百万行从 SQL Server 数据库加载到 DataTable 时得到了 System.OutOfMemoryException。是否真的不是填充DataTable,而是更快地例如以某种方式将其加载到CSV或除此之外的任何其他格式?请您的建议,最终给出建议/示例。

【问题讨论】:

  • 这真的取决于你想要做什么。所有数据的最终目的地是什么?分析?另一个数据存储?你需要更具体。否则我们只能告诉你购买更多的内存?
  • DataTables 自多年前就已过时,因此请尽可能避免使用它们。此外,这意味着您将在内存中保存数据集的完整副本,因此最好直接使用SqlDataReader 并将数据发送到其他地方。当然,一次选择数百万条记录有其自身的一系列问题,因此请尽可能限制它。
  • 从数据库表中批处理行。这可能是一种选择。
  • @CodeMonkey 最后的目的地将是我已经用虚拟模式准备好的datagridview。所以我需要以某种方式从数据库中下载记录(肯定不是数据表),然后在 datagridview 中使用
  • @Alejandro 不幸的是,我必须下载数百万条记录用于分析目的,目的地是我在虚拟模式下配置的 datagridview,所以我需要避免将记录下载到 Datatable,但在其他地方然后使用datagridview,你可能建议用什么 csv 文件?

标签: c# sql-server


【解决方案1】:

不知道如何使用数据,您可以使用SqlDataReader 提取所有数据,然后将其写入 SQLite 数据库文件。这实质上为您提供了百万行的本地缓存版本,您可以查询它,就像它存储在数据库中一样,但不会占用内存,因为它被写入本地文件(并在需要时提供内存缓存)。

https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/?tabs=netcore-cli

【讨论】:

  • 我的目标是在 datagridview 中使用该数据——我已经在虚拟模式下配置了它。那么你的建议是使用 SqlDataReader 将数据从 sql server 加载到本地 sqllite 文件,然后当网格 neds 特定行时,只需通过查询它来询问 sqllite?
  • 其他问题 CSV 怎么样?如果我和上面写的一样,但不是 sqllite 使用 sqldatareader 从 sql server 读取数据到 csv,然后将该 csv 用于 datagridview?
  • 老实说,正如其他人所提到的,您确实需要对结果进行分页。在 Sqlite 中存储只是 CSV 的替代品,因为它本质上是一个文件,可以像数据库一样使用,以防您往返常规 SQL 服务器会太慢,但它非常灵活,因为您不必编写在其顶部实现数据表。
  • 我明白了,因此无论我选择 sqllite、csv、xml 还是那些都比数据表好得多,对吧?
  • 如果您要绑定到网格,我会考虑放弃数据表,只使用数据的直接 poco 类并绑定到该数据表。如果您真的需要数据表的跟踪功能,我会选择 EF 核心路线,尤其是在这种情况下,您可能会遇到一些性能问题。如果您遇到麻烦,您可以将 EF 核心数据提供程序更换为可能对您更有效的提供程序,而无需更改您的任何代码(用于 sqlite 的 sql 等)。 docs.microsoft.com/en-us/ef/core
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多