C# ETL处理设计与性能
我正在使用支持SQL Server和Oracle的C#为数据仓库开发一个ETL流程。在开发过程中,我一直在编写将数据从一个数据库同步到另一个数据库的存储过程。存储过程代码相当难看,因为它涉及动态SQL。它需要构建SQL字符串,因为我们有动态数据库名称 我的团队负责人希望使用C代码进行ETL。我们有代码生成,当数据库定义更改时自动生成新类。这也是我决定不使用Rhino ETL的原因 以下是优点和缺点: 存储过程: 优点:C# ETL处理设计与性能,c#,sql,database,etl,C#,Sql,Database,Etl,我正在使用支持SQL Server和Oracle的C#为数据仓库开发一个ETL流程。在开发过程中,我一直在编写将数据从一个数据库同步到另一个数据库的存储过程。存储过程代码相当难看,因为它涉及动态SQL。它需要构建SQL字符串,因为我们有动态数据库名称 我的团队负责人希望使用C代码进行ETL。我们有代码生成,当数据库定义更改时自动生成新类。这也是我决定不使用Rhino ETL的原因 以下是优点和缺点: 存储过程: 优点: 快速加载过程,一切都由数据库处理 易于部署,无需编译 缺点 动态SQL
- 快速加载过程,一切都由数据库处理
- 易于部署,无需编译
- 动态SQL导致可读性差
- 当数据库定义更改时,需要同时维护T-SQL和PL/SQL脚本
- 开发缓慢,因为在编写动态SQL时没有intellisense
- 更容易开发ETL过程,因为我们从生成的类中获得intellisense
- 由于生成了类,因此更易于维护
- 更好的日志记录和错误处理
- 与存储过程相比,性能较慢
谢谢您说您有自动生成新类的代码生成功能-为什么您没有自动生成新存储过程的代码生成功能 这将给你两个世界中最好的;将其封装到几个漂亮的类中,这些类可以检查数据库并在必要时更新内容,您可以不增加可读性,而是隐藏它(您不需要手动更新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)
所以我认为你的正反两方面都非常准确;您必须在开发速度和易用性之间做出选择,但不能两者兼而有之。我们实际上已经考虑过了。不幸的是,由于时间限制,我们决定暂时放弃这个想法。。理想情况下,我们希望创建一个存储过程模板,并使用代码生成代码填充列名称和JOIN语句,因为这些列定义经常更改。根据您的喜好,您可以使用KISS原则,例如,花15分钟编写该模板,连接到数据库架构并使用SQL从中选择表和列,用列和表列表填充某些表,标记实际需要的表,并循环这些表以填充模板并创建将创建SP的脚本。备份架构,然后运行脚本。如果您有100多个表,如果您不知道如何查询模式,我同意这将需要将近两个小时。当事情再次发生变化时,你是对的,这是性能与可维护性的选择。我们实际上计划有一个混合的,对于一般有超过10000个的数据,我们将在存储过程中进行。我担心的是,即使是10000行,70秒对1秒也太多了。目前,我们的应用程序尚未利用MSSQL或Oracle提供的任何功能。该应用程序只执行标准SQL操作。我只知道一次