C# ETL处理设计与性能

C# ETL处理设计与性能,c#,sql,database,etl,C#,Sql,Database,Etl,我正在使用支持SQL Server和Oracle的C#为数据仓库开发一个ETL流程。在开发过程中,我一直在编写将数据从一个数据库同步到另一个数据库的存储过程。存储过程代码相当难看,因为它涉及动态SQL。它需要构建SQL字符串,因为我们有动态数据库名称 我的团队负责人希望使用C代码进行ETL。我们有代码生成,当数据库定义更改时自动生成新类。这也是我决定不使用Rhino ETL的原因 以下是优点和缺点: 存储过程: 优点: 快速加载过程,一切都由数据库处理 易于部署,无需编译 缺点 动态SQL

我正在使用支持SQL Server和Oracle的C#为数据仓库开发一个ETL流程。在开发过程中,我一直在编写将数据从一个数据库同步到另一个数据库的存储过程。存储过程代码相当难看,因为它涉及动态SQL。它需要构建SQL字符串,因为我们有动态数据库名称

我的团队负责人希望使用C代码进行ETL。我们有代码生成,当数据库定义更改时自动生成新类。这也是我决定不使用Rhino ETL的原因

以下是优点和缺点:

存储过程:

优点:

  • 快速加载过程,一切都由数据库处理
  • 易于部署,无需编译
缺点

  • 动态SQL导致可读性差
  • 当数据库定义更改时,需要同时维护T-SQL和PL/SQL脚本
  • 开发缓慢,因为在编写动态SQL时没有intellisense
C#代码:

优点:

  • 更容易开发ETL过程,因为我们从生成的类中获得intellisense
  • 由于生成了类,因此更易于维护
  • 更好的日志记录和错误处理
缺点:

  • 与存储过程相比,性能较慢
我更愿意使用应用程序代码来执行ETL过程,但与存储过程相比,性能非常糟糕。在一个测试中,当我尝试更新10000行时。存储过程只花了1秒,而我的ETL代码花了70秒。即使我设法减少了开销,70年代中有20%的人纯粹是从应用程序代码中调用update语句

有人能给我提供一些建议或评论,说明如何使用应用程序代码来加速ETL过程吗

我的下一个想法是尝试通过打开多个数据库连接并执行更新和插入来执行并行ETL过程


谢谢

您说您有自动生成新类的代码生成功能-为什么您没有自动生成新存储过程的代码生成功能

这将给你两个世界中最好的;将其封装到几个漂亮的类中,这些类可以检查数据库并在必要时更新内容,您可以不增加可读性,而是隐藏它(您不需要手动更新SP)

此外,差异不应该太大,听起来好像您没有做正确的事情(重用连接,将不必要的数据从服务器移动到应用程序,或者以较小的批处理数据—逐行?)


另外,关于更好的日志记录,请详细说明?你也可以登录数据库层,或者你可以设计你的SPS,这样应用层仍然可以进行日志记录。

< P>你可以考虑调整你的应用程序。 我的一些技巧:

  • 不要过度使用connection.Open()和conenction.Close()
  • 在某些情况下LINQ会让事情变慢
  • 使用过程并在加载时传递更多参数以减少调用次数,例如,
    proc\u load\u to_table(p1 text)
    更改为
    proc\u load\u to_table(p1 text、p2 text、p3 text、p4 tex、p5 text)
如果你的C#代码已经慢了10000行,我无法想象在真实的环境中

大多数ETL要么在数据库中完成(、包,甚至在数据库中编译(PL/SQL、Java for Oracle))。它们可以处理数百万行

或者可以使用一些专业工具(Informatica或其他),但它仍然比存储过程慢,但更易于管理

所以我的结论是:如果你想接近存储过程的性能,你必须编写一个和市场上那些专业应用程序一样好的应用程序,这些应用程序花了很多年的时间开发和成熟。。。你认为你能吗

另外,如果您必须处理不同的数据库类型(、Oracle),则不能同时创建通用应用程序并对其进行优化,这是一种选择。因为Oracle与SQLServer的工作方式不同

让您了解一下,在针对Oracle的ETL中,使用了提示(如并行执行提示),并且可能会暂时删除一些索引或禁用完整性以优化ETL

据我所知,SQLServer中没有完全相同的东西(它们可能有类似的选项,但语法不同)。 因此,“所有数据库的一个ETL”很难做到不损失效率和速度


所以我认为你的正反两方面都非常准确;您必须在开发速度和易用性之间做出选择,但不能两者兼而有之。

我们实际上已经考虑过了。不幸的是,由于时间限制,我们决定暂时放弃这个想法。。理想情况下,我们希望创建一个存储过程模板,并使用代码生成代码填充列名称和JOIN语句,因为这些列定义经常更改。根据您的喜好,您可以使用KISS原则,例如,花15分钟编写该模板,连接到数据库架构并使用SQL从中选择表和列,用列和表列表填充某些表,标记实际需要的表,并循环这些表以填充模板并创建将创建SP的脚本。备份架构,然后运行脚本。如果您有100多个表,如果您不知道如何查询模式,我同意这将需要将近两个小时。当事情再次发生变化时,你是对的,这是性能与可维护性的选择。我们实际上计划有一个混合的,对于一般有超过10000个的数据,我们将在存储过程中进行。我担心的是,即使是10000行,70秒对1秒也太多了。目前,我们的应用程序尚未利用MSSQL或Oracle提供的任何功能。该应用程序只执行标准SQL操作。我只知道一次