每晚,我需要从拥有超过800万条记录的ODBC源填充SQL Server 2005表。目前我正在使用链接服务器的insert语句,其语法选择类似于:
Insert Into SQLStagingTable from Select * from OpenQuery(ODBCSource, 'Select * from SourceTable')
这非常低效,需要数小时才能运行。我正在使用类似于this question中的代码的SqlBulkInsert代码编写解决方案。
该问题中的代码首先在内存中填充数据表,然后将该数据表传递给SqlBulkInserts WriteToServer方法。
如果填充的数据表使用的内存多于运行的计算机上的可用内存(在我的情况下,内存为16GB的服务器),我该怎么办?
我考虑使用重载的ODBCDataAdapter fill方法,它允许您只填充从x到n的记录(其中x是起始索引,n是要填充的记录数)。然而,这可能会比我现在的解决方案更慢,因为它意味着要在源上重新运行select语句很多次。
我该怎么办?只需立即填充整个内容,让操作系统管理内存?我应该把它装进大块吗?还有其他我没有想过的解决方案吗?
答案 0 :(得分:4)
最简单的方法是对您的odbc数据源使用ExecuteReader()并将IDataReader传递给WriteToServer(IDataReader)重载。
大多数数据读取器实现只会将总结果的一小部分保留在内存中。
答案 1 :(得分:1)
SSIS表现良好,非常可调。根据我的经验,800万行并没有超出其联盟。我的一个较大的ETL每天吸引2400万行,并进行重大转换和维度数据仓库操作。
答案 2 :(得分:0)
如果目标表上有索引,您可以考虑在插入记录之前禁用它们吗?