ETL处理设计和性能

dsu*_*sum 6 c# sql database etl

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

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

以下是优点和缺点:

存储过程:

优点:

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

缺点

  • 由于动态SQL导致可读性差
  • 数据库定义更改时需要维护T-SQL和PL/SQL脚本
  • 开发缓慢,因为在编写动态SQL时没有智能感知

C#代码:

优点:

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

缺点:

  • 与存储过程相比性能较慢

我更喜欢使用应用程序代码来执行ETL过程,但与存储过程相比,性能非常糟糕.在一次测试中,当我尝试更新10,000行时.存储过程只用了1秒,而我的ETL代码用了70秒.即使我以某种方式设法减少开销,70%的20%纯粹是从应用程序代码调用更新语句.

有人可以提供有关如何使用应用程序代码加速ETL过程的建议或评论吗?

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

谢谢

Unr*_*son 2

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

这应该给你两全其美的效果;将其封装到一些不错的类中,这些类可以检查数据库并根据需要更新内容,并且您可以不增加可读性,而是隐藏它(您不需要手动更新 SP)

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

另外,关于更好的日志记录 - 愿意详细说明吗?您也可以在数据库层进行日志记录,或者您可以设计 SP,以便应用程序层仍然可以进行日志记录。