sql往oracle大量传输,c# - Oracle和SQL Server之间的多线程数据传输 - 网络性能 - 堆栈内存溢出...

我们希望在一段时间内在Oracle 11g R2和SQL Server 2014之间传输大量数据......我们正在谈论20多个Tb,数千个表和数十亿条记录(这是一个为期5年的Datawarehouse)

SSIS它不是一个选项,因为我们需要传输的表和分区数量巨大,大约有4万个表和分区..我们有一些营销应用程序,广告系列管理器,挖掘模型和其他,运行在不同的模式...一些他们每天创建大约150个新表,“drop table rate”每天大约100个...这些表中的一些有索引,有些没有...这个模式是我们不能简单地使用SSIS的原因,原因我们也需要转移它们... 编辑以包含更多关于为什么SSIS看起来不可行的信息

所以我们用.Net 4.5.1在C#2013开发了一个应用程序,它是多线程的...每个线程在oracle中读取一个表/分区,在sql server中创建相同的表/分区模式,然后继续在oracle中选择数据,并在sql server中插入批量,最后创建每个挂起的约束和索引...

我们面临的主要问题之一是传输速度......对于我们的C#应用​​程序,将传输1个事实表的SSIS性能与30个分区(每月事实,每日分区,每个分区约30万行,60多列)进行比较,我们发现应用程序永远不会使用全网速,而SSIS使用100%(我们使用适用于Oracle的Attunity SSIS连接器......可能其中一个速度传输优势就在这里,我不知道),如果可以,我们希望改进这一点...

这是负责写入的代码块

//private static async Task saveDataBlock(IDataReader reader, string destinationTable, int batchSize)

private static void saveDataBlock(IDataReader reader, string destinationTable, int batchSize)

{

//System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(getConnString(destinationCS));

//System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(getConnString(destinationCS), System.Data.SqlClient.SqlBulkCopyOptions.KeepIdentity & System.Data.SqlClient.SqlBulkCopyOptions.KeepNulls & System.Data.SqlClient.SqlBulkCopyOptions.TableLock);

using (SqlBulkCopy bc = new SqlBulkCopy(getConnString(destinationCS)))

{

bc.BulkCopyTimeout = 0;

bc.DestinationTableName = destinationTable;

bc.BatchSize = batchSize; //2500,5000,10000.. best so far, 5000

//bc.BatchSize = 0;

bc.NotifyAfter = batchSize;

bc.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied);

//bc.EnableStreaming = true;

bc.ColumnMappings.Clear();

for (int i = 0; i < reader.FieldCount; i++)

{

bc.ColumnMappings.Add(reader.GetName(i), reader.GetName(i));

}

bc.WriteToServer(reader);

//await bc.WriteToServerAsync(reader);

//bc.Close();

}

//System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(getConnString(destinationCS), SqlBulkCopyOptions.UseInternalTransaction);

}

任何人都有任何关于我们可以测试configure的选项(代码的注释部分来自以前测试的选项),SQL Server或C#app中的SQLBulkCopy对象的建议吗?

PS:关于我们环境的一些信息... Oracle Server Client Uplink 2 Gbps,SQL Server Downlink 1 Gbps,Oracle是32核系统,我们的测试SQL Server是16核Win Server 2012 R2系统... SSIS Net传输速度是1 Gbps满,C#App Net传输速度约为70 mbps,有16个线程......

编辑以提供有关传输速度的更多信息

有关我们的应用测试的更多信息:

2个线程= 15-25 Mbps

4个线程= 30-40 Mbps

8个线程= 60-65 Mbps

16个线程= 65-70 Mbps

高于16的所有内容(每个系统核心1个应用程序线程)将性能降低到30-50 Mbps。

我们的SAN能够以高I / O数量高于500 MB / s的速度运行

我们最好的批量大小时间我们得到它的值为每批2500-5000行(5分钟内约有1500万行,8-16个线程)

现在我们的应用程序将数据从oracle中的一个表/分区传输到SQL Server中的其他...我们有一些非分区的表,有100多万行...对于这个表,我们测试了多个线程读取同一个表...我们在读取过程中成功,但在批量插入数据时失败

每个线程读取同一个表在数字列上执行MOD操作...

select * from schema.table where MOD(NUMERIC_COLUMN, N) = 0 to N-1

N是我们正在运行的线程数...我们尝试重新创建一些SSIS行为以最大化线程使用和Oracle / SQL中的数据读/写。在SSIS中,我们可以在目标处设置每个线程使用LOCK TABLE选项,并且它工作完美无缺..但在我们的应用程序中执行它时,每个线程在插入期间锁定表,最后我们的并行化设计运行序列化:((这不是问题的主要原因,但如果有人对此提出建议) ,将不胜感激)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值