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

Posted

技术标签:

【中文标题】Oracle 和 SQL Server 之间的多线程数据传输 - 网络性能【英文标题】:Multithread Data Transfer between Oracle & SQL Server - Network Performance 【发布时间】:2015-02-15 07:41:03 【问题描述】:

我们希望在短时间内在 Oracle 11g R2 和 SQL Server 2014 之间传输大量数据……我们谈论的是 20+ Tb、数千个表和数十亿条记录(这是 5 年数据仓库)

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

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

我们面临的主要问题之一是传输速度......将 1 个事实表与 30 个分区(每月事实、每日分区、每个分区约 3000 万行、60 多列)与我们的 C# 进行比较的 SSIS 性能应用程序,我们发现该应用程序从不使用全网速,而 SSIS 使用 100%(我们使用 Attunity SSIS 连接器 for Oracle ......而且速度传输优势之一可能在这里,我不知道),我们想要改进这一点如果可以的话……

这是负责写入的代码块

//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);            


任何人对我们可以在 SQL Server 或 C# 应用程序中的 SQLBulkCopy 对象中测试 configure 的任何选项(代码的注释部分来自以前测试的选项)有任何建议吗?

PS:一些关于我们环境的信息...... Oracle Server Client Uplink 2 Gbps,SQL Server Downlink 1 Gbps,Oracle是32核的系统,我们测试的SQL Server是16核的Win Server 2012 R2系统... SSIS Net传输速度满1Gbps,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 选项设置每个线程目的地,它工作完美..但是在我们的应用程序中执行此操作时,每个线程在插入期间锁定表,最后我们的并行化设计运行序列化:((这不是问题的主要原因,但如果有人有对此提出建议,将不胜感激)

【问题讨论】:

当您运行 SSIS 和 c# 应用程序时,您是否发现写入 SQL 的等待类型/时间有什么不同? 出于反常的好奇,你能不能帮我理解一下SSIS it's not an option, because the amount of tables &amp; partitions we need to transfer is huge 与你的国产系统相比,它的处理速度似乎还不错 那么你创建了多少线程?同时运行许多线程将是一个很大的性能打击。显示更多代码。 @BradD 实际上我没有控制等待类型/时间 首先,我希望你知道它是 SSIS,而不是 DTS。其次,从 DTS 时代开始,就可以通过编程方式创建包。您应该能够自动创建所需的包,并让 SSIS 完成所有工作。这就是它的目的。 【参考方案1】:

您距离 1Gbps 链路的理论最大吞吐量不远了。 1Gbps 的最大吞吐量为 125 MB/s,没有任何开销。您实际上看到的是 90 MB/s,如果您正在通过必须处理数据包的第 3 层交换机、路由器或防火墙,吞吐量将会下降。您最好的选择是让服务器位于同一网段,并在它们之间获得更高速度的链接。我怀疑当线程数较高时吞吐量下降的原因是因为线程正在争夺对 NIC 的访问权(或者由于数据包大小较大,NIC 正在为每个数据包引入延迟)并且线程正在暂停执行(睡觉)再试一次。

我认为您的问题是吞吐量。通过绑定两个 1Gbps 链接尝试更高速度的连接。或者,如果服务器彼此靠近,则使用交叉电缆直接连接它们(无交换机),以查看传输速度是否提高。如果他们这样做,您就知道您遇到了吞吐量问题。如果他们不这样做,您至少已经消除了一种可能性。

【讨论】:

以上是关于Oracle 和 SQL Server 之间的多线程数据传输 - 网络性能的主要内容,如果未能解决你的问题,请参考以下文章

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

数据库语言之间的区别 SQL server , Oracle , mysql , db2``

MYSQL sqlserver oracle 之间的优缺点

Oracle与SQL Server如何实现表数据同步

Oracle与SQL Server实现表数据同步

标准脚本数据库变量(Oracle 与 Sql Server 术语)