使用C#从Oracle到SQL Server的Extract-Transform-Load

时间:2011-04-16 16:26:39

标签: c# oracle sql-server-2005 parallel-processing etl

我一直在SO附近闲逛几天,发现社区很棒!我确定有人可以就我的问题给我一个意见:

我们在Oracle服务器中有原始数据,我们的查询获取大约312 MB的数据(我们需要在几个表中连接的列)。这是使用Oracle.DataAccess.Client FetchSize = RowSize * 512完成的,大约是3.9 MB。我目前正在使用OracleDataReader并在while()循环中进行处理。

然后使用准备好的参数化IF EXISTS() UPDATE ELSE INSERT写入处理结果。在此DB中,我们可以在加入维度表后直接在Excel中返回所需的数据。

我正在寻找改善表现的方法。是否可以使用多线程BULK INSERTUPDATE并且还可以多线程处理行(例如,开始4个线程并在它们之间均匀地划分行)并执行类似{{1}的操作存在于SQL Server 2005中?

正在寻找复制粘贴代码,我对现有的最佳实践或模式更感兴趣。

最诚挚的问候,

1 个答案:

答案 0 :(得分:1)

我不确定在线程之间划分传入的行会获得什么,因为它们都必须插入到同一目标表中。插入数据库可能会成为瓶颈,客户端上的多个线程可能最终都会等待彼此。

我的常规方法是使用SqlBulkCopy从OracleDataReader读取行并将它们插入目标数据库中的空登台表。

然后批量处理登台表,UPSERTing到目标表。每批都是一笔交易。