【问题标题】:Extract-Transform-Load from Oracle to SQL Server with C#使用 C# 从 Oracle 提取-转换-加载到 SQL Server
【发布时间】:2011-04-16 16:26:38
【问题描述】:

我已经在附近闲逛了几天,发现社区很棒!我确信有人可以就我的问题给我意见:

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

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

我正在寻找提高性能的方法。是否可以多线程 BULK INSERTs 和 UPDATEs 以及多线程处理行(比如启动 4 个线程并在它们之间平均划分 incomming 行)并执行类似 BULK UPDATE 的操作在 SQL Server 2005 中存在?

不是在寻找复制粘贴代码,我对已经存在的最佳实践或模式更感兴趣。

最好的问候,

【问题讨论】:

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


    【解决方案1】:

    我不确定在线程之间划分传入行会对您有什么好处,因为它们都必须插入同一个目标表中。插入数据库可能会成为瓶颈,客户端上的多个线程可能最终只是相互等待。

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

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

    【讨论】:

    • 我假设 OracleDataReader 实现 IDataReader 那么,但这是否意味着我必须在 SQL 中进行所有数据转换?或者我可以以某种方式重载OracleDataReader,以便它返回已经计算的列? +1 告诉我SqlBulkCopyMERGE
    • 是的,这意味着您需要在 SQL 中进行转换 - 例如在 Oracle 查询中。如果您不能这样做,另一种方法可能是围绕 OracleDataReader 编写您自己的包装类,该类实现 IDataReader 并执行您想要的转换。
    • 因此,插入数据库确实是瓶颈。感谢您的宝贵建议,我接受答案!
    猜你喜欢
    • 2019-03-08
    • 2010-11-28
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多