我一直在SO附近闲逛几天,发现社区很棒!我确定有人可以就我的问题给我一个意见:
我们在Oracle服务器中有原始数据,我们的查询获取大约312 MB的数据(我们需要在几个表中连接的列)。这是使用Oracle.DataAccess.Client
FetchSize = RowSize * 512
完成的,大约是3.9 MB。我目前正在使用OracleDataReader
并在while()
循环中进行处理。
然后使用准备好的参数化IF EXISTS() UPDATE ELSE INSERT
写入处理结果。在此DB中,我们可以在加入维度表后直接在Excel中返回所需的数据。
我正在寻找改善表现的方法。是否可以使用多线程BULK INSERT
和UPDATE
并且还可以多线程处理行(例如,开始4个线程并在它们之间均匀地划分行)并执行类似{{1}的操作存在于SQL Server 2005中?
我不正在寻找复制粘贴代码,我对现有的最佳实践或模式更感兴趣。
最诚挚的问候,
答案 0 :(得分:1)
我不确定在线程之间划分传入的行会获得什么,因为它们都必须插入到同一目标表中。插入数据库可能会成为瓶颈,客户端上的多个线程可能最终都会等待彼此。
我的常规方法是使用SqlBulkCopy从OracleDataReader读取行并将它们插入目标数据库中的空登台表。
然后批量处理登台表,UPSERTing到目标表。每批都是一笔交易。