C# 使用C从Oracle提取到SQL Server的转换负载#
我在附近闲逛了几天,发现社区很棒!我相信有人会对我的问题发表意见: 我们在Oracle服务器中有原始数据,我们的查询获取大约312MB的数据(只是我们需要跨多个表连接的列)。这是通过使用大约3.9 MB的C# 使用C从Oracle提取到SQL Server的转换负载#,c#,oracle,sql-server-2005,parallel-processing,etl,C#,Oracle,Sql Server 2005,Parallel Processing,Etl,我在附近闲逛了几天,发现社区很棒!我相信有人会对我的问题发表意见: 我们在Oracle服务器中有原始数据,我们的查询获取大约312MB的数据(只是我们需要跨多个表连接的列)。这是通过使用大约3.9 MB的Oracle.DataAccess.Client实现的。我目前正在使用OracleDataReader,并在他的while()循环中进行处理 然后使用准备好的参数化IF EXISTS()UPDATE ELSE INSERT写入处理结果。从这个数据库中,我们可以在加入维度表后直接在Excel中返回
Oracle.DataAccess.Client
实现的。我目前正在使用OracleDataReader
,并在他的while()
循环中进行处理
然后使用准备好的参数化IF EXISTS()UPDATE ELSE INSERT
写入处理结果。从这个数据库中,我们可以在加入维度表后直接在Excel中返回所需的数据
我正在寻找提高性能的方法。是否可以多线程批量插入
s和更新
s,也可以多线程处理行(比如启动4个线程并在它们之间平均划分输入行),SQL Server 2005中是否存在类似批量更新
的功能
我不是在寻找复制粘贴代码,我更感兴趣的是已有的最佳实践或模式
非常感谢,我不确定在线程之间划分传入行会得到什么好处,因为它们都必须插入到同一个目标表中。在数据库中插入很可能是瓶颈,客户端上的多个线程可能最终会互相等待 我通常的方法是使用SqlBulkCopy从OracleDataReader读取行,并将它们插入到目标数据库中的空暂存表中
然后分批处理暂存表,并向上插入到目标表中。每个批处理都将是一个事务。我假设
OracleDataReader
实现了IDataReader
,但这是否意味着我必须在SQL中进行所有数据转换?或者我可以通过某种方式重载OracleDataReader,使其返回已计算的列吗+感谢您告诉我有关SqlBulkCopy
和MERGE
的信息!是的,这意味着您需要在SQL中进行转换,例如在Oracle查询中。如果您不能做到这一点,另一种方法可能是围绕OracleDataReader编写您自己的包装器类,该类实现IDataReader并执行您想要的转换。谢谢你的建议,我接受答案!