什么';这是使用SqlBulkCopy填充非常大的表的最佳方法

本文关键字:填充 非常 方法 最佳 SqlBulkCopy 什么 | 更新日期: 2023-09-27 17:47:24

晚上,我需要用超过800万条记录从ODBC源填充一个SQLServer2005表。目前,我正在使用来自链接服务器的插入语句,语法选择与此类似:

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

这真的很低效,而且需要几个小时才能运行。我正在使用与本问题中的代码类似的SqlBulkInsert代码编写解决方案。

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

如果填充的数据表使用的内存超过了它正在运行的机器(在我的情况下是一个16GB内存的服务器)上的可用内存,我该怎么办?

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

我该怎么办?只需一次填充整个内容,然后让操作系统管理内存?我应该把它填充成块吗?还有其他我没有想到的解决方案吗?

什么';这是使用SqlBulkCopy填充非常大的表的最佳方法

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

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

SSIS性能良好,可调整性很强。根据我的经验,800万排并不是不可能的。我的一个较大的ETL每天处理2400万行,并进行主要的转换和维度数据仓库操作。

如果目标表上有索引,您可能会考虑禁用这些索引,直到插入记录为止?