我正在为使用C#的数据仓库开发ETL过程,该过程同时支持SQL Server和Oracle。在开发过程中,我一直在编写将数据从一个数据库同步到另一个数据库的存储过程。存储过程代码相当丑陋,因为它涉及动态SQL。由于我们有动态数据库名称,所以需要构建SQL字符串。ETL处理设计和性能
我的团队负责人希望使用C#代码来执行ETL。我们有代码生成功能,可以在数据库定义更改时自动生成新类。这也是我决定不使用Rhino ETL的原因。
这里有利弊:
存储过程:
优点:
- 快速加载过程中,一切都被数据库
- 易于部署处理,则需要 没有编译
缺点
- 可读性差,由于动态SQL
- 需要保持两个T-SQL和PL/SQL脚本时,数据库定义编写动态SQL
C#代码时改变
优点:
- 更容易开发的ETL过程,因为我们从产生
- 类获得智能更容易,因为生成的类的维护
- 更好的日志记录和错误处理
缺点:
- 缓慢性能比较与存储过程
我宁愿使用应用程序代码来执行ETL过程,但perf与存储过程相比,性能是可怕的。在一次测试中,当我尝试更新10,000行时。存储过程只需要1秒,而我的ETL代码花费了70秒。即使我以某种方式设法减少开销,70%的20%纯粹是从应用程序代码调用更新声明。
有人能提供一些关于如何使用应用程序代码加速ETL过程的建议或评论吗?
我的下一个想法是尝试通过打开多个数据库连接并执行更新和插入来执行并行ETL过程。
感谢
我们其实已经考虑过了。不幸的是,时间限制,我们决定暂时放弃这个想法。理想情况下,我们希望创建一个存储过程模板,并让代码生成代码填充列名称和连接语句,因为这些列定义经常发生更改。 – dsum 2010-12-02 16:24:17
好吧,根据你想要的奇特性,你可以使用KISS原则,例如花费15分钟,编写该模板,连接到数据库模式,并使用SQL从中选择表格和列,使用该列表填写某个表列和表格,标记您实际需要的表格并遍历这些表格以填充模板并创建将创建SP的脚本。对模式进行备份,然后运行脚本。如果你有超过100个表,并且如果你不知道如何查询模式,我确实认为这需要将近两个小时。当事情改变重复。 – Unreason 2010-12-02 16:36:40