c# - 使用 SqlBulkCopy 填充非常大的表的最佳方法是什么?

标签 c# .net sql-server vb.net sqlbulkcopy

每晚,我都需要从 ODBC 源填充 SQL Server 2005 表,其中包含超过 800 万条记录。目前,我正在使用来自链接服务器的插入语句,其语法选择类似于以下内容:

Insert Into SQLStagingTable from Select * from OpenQuery(ODBCSource, 'Select * from SourceTable')

这确实效率低下并且需要几个小时才能运行。我正在使用 SqlBulkInsert 代码编写一个解决方案,类似于 this question 中的代码。 。

该问题中的代码首先填充内存中的数据表,然后将该数据表传递给 SqlBulkInserts WriteToServer 方法。

如果填充的数据表使用的内存多于其运行的计算机(在我的情况下为具有 16GB 内存的服务器)上的可用内存,我该怎么办?

我考虑过使用重载的 ODBCDataAdapter fill方法,该方法允许您仅填充从 x 到 n 的记录(其中 x 是起始索引,n 是要填充的记录数)。然而,这可能是一个比我目前拥有的解决方案更慢的解决方案,因为这意味着在源上多次重新运行 select 语句。

我该怎么办?只需立即填充整个内容并让操作系统管理内存?我应该分块填充它吗?还有其他我没有想到的解决方案吗?

最佳答案

最简单的方法是对 odbc 数据源使用 ExecuteReader() 并传递 IDataReaderWriteToServer(IDataReader)过载。

大多数数据读取器实现只会将总结果的一小部分保留在内存中。

关于c# - 使用 SqlBulkCopy 填充非常大的表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/196420/

相关文章:

sql - 带子查询的SQL更新语法

java - 在java中获取数据库连接

SQL Server 2000 : how do I return only the number from a phone number column

c# - 这会是 sql 注入(inject)的受害者吗

c# - 确保类的所有新实例都实现所有字段或属性

.net - 项目中的所有系统命名空间都未定义

.net - Windows Phone 8 全屏页面

c# - 在基类和派生类中实现接口(interface)

c# - NHibernate session 工厂

c# - 无模式窗体的正常关闭和使用 block 中的打开模态窗体。足够的?