小编fig*_*ipy的帖子

Oracle和SQL Server之间的多线程数据传输 - 网络性能

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

SSIS它不是一个选项,因为我们需要传输的表和分区数量巨大,大约有4万个表和分区..我们有一些营销应用程序,Campaign Manager,挖掘模型和其他,运行在不同的模式中...他们每天创建大约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 …
Run Code Online (Sandbox Code Playgroud)

c# sql-server oracle multithreading ssis

5
推荐指数
1
解决办法
840
查看次数

标签 统计

c# ×1

multithreading ×1

oracle ×1

sql-server ×1

ssis ×1