繁体   English   中英

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

[英]What's the best way to use SqlBulkCopy to fill a really large table?

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

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

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

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

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

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

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

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

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

SSIS表现良好,并且非常可调整。 以我的经验,有800万行并不是没有竞争对手。 我的一个较大的ETL每天要吸引2400万行,并进行重大转换和维数据仓库操作。

如果目标表上有索引,则可以考虑禁用这些索引,直到插入记录?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM