使用SqlBulkCopy填充一个非常大的表的最佳方法是什么?

.net c# sqlbulkcopy sql-server vb.net

每晚,我需要从拥有超过800万条记录的ODBC源填充SQL Server 2005表。目前我正在使用链接服务器的insert语句,其语法选择类似于:

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

这实在是效率低下,需要花费数小时才能运行。我正在使用类似于此问题中的代码的SqlBulkInsert代码编写解决方案。

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

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

我想过使用重载的ODBCDataAdapter 填充方法,它允许你只填充从x到n的记录(其中x是起始索引,n是要填充的记录数)。然而,这可能会比我现在的解决方案更慢,因为它意味着要多次在源上重新运行select语句。

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

一般承认的答案

最简单的方法是对您的odbc数据源使用ExecuteReader()并将IDataReader传递给WriteToServer(IDataReader)重载。

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


热门答案

SSIS表现良好,非常可调。根据我的经验,800万行并没有超出其联盟。我的一个较大的ETL每天吸引2400万行,并进行重大转换和维度数据仓库操作。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因