【问题标题】:How to reducing impact on OLTP when performing ETL Process执行 ETL 流程时如何减少对 OLTP 的影响
【发布时间】:2011-02-23 20:32:33
【问题描述】:

我是设计 ETL 流程的新手。目前我有两个数据库,一个是应用程序在日常事务中使用它的实时数据库。另一个是数据仓库。

我在实时数据库中有一个表,它会定期向其中插入新数据。目标是每天晚上 ETL 流程将实时数据库中的数据传输到数据仓库,然后删除实时数据库中的数据。

由于我缺乏知识,我得到的解决方案是实现一种称为滚动表的东西。基本上在实时数据库上,我有两个结构相同的表。我称它们为 tblLive1tblLive2。我还有一个同义词叫tblLive。所有插入都是在同义词上完成的。同义词将指向其中一张表。

当我运行 ETL 过程时,我有一个存储过程,它会删除并创建一个指向 tblLive2 的新同义词。这允许 ETL 过程从 tblLive1 转换数据而不影响应用程序。假设 ETL 进程需要一个小时才能运行,我不希望 ETL 进程锁定表,阻止应用程序向其中插入新数据。

这个解决方案理论上应该可行,但并不优雅。

我确定这个问题是一个常见问题,还有其他解决方案吗?

【问题讨论】:

  • 您使用的是什么数据库以及该数据库的版本?答案可能会高度依赖于数据库,除非您真的想要尝试提出与数据库无关的解决方案的开销。
  • 我现在使用的是 SQL Server,但这个概念也适用于 Oracle。

标签: sql-server database etl data-warehouse


【解决方案1】:

补充 Bob 的答案(上图),在 DWH/BI 应用程序中,所有必要的表基本上都复制到 DWH 数据库上的“暂存”数据库或“暂存”模式中(取决于表/大小等)。这些通常位于与您的 OLTP 系统不同的服务器上 - 对于任何大小的 DWH 实现)

要回答有关性能影响的问题,这取决于您的服务器规范/io 配置。

数据是否每天 24 小时都被插入到 OLTP 系统中?还是有停机时间?还是交通流量低?

使用数据库压缩可能是值得的,因为 IO 将成为您最大的敌人,这将有很大帮助。

【讨论】:

  • 流量时间较短。所以这绝对是我们执行 ETL 过程的时间。感谢您的建议,我实际上认为可能值得先对 OTLP db 中的表进行快照复制,然后将它们移动到 DWH,然后在 DWH 上执行转换。目前,ETL 过程的设计使得转换要么在 C# 应用程序中完成,要么在存储过程中完成。这个存储过程存储在 DWH 中,但是它动态访问 OLTP 和 DWH 来做 ETL。
【解决方案2】:

将表读入暂存区并处理暂存表。您通常希望在生产系统上花费尽可能少的时间。尤其是在使用中。

您可能还想研究使用由触发器加载的表。或者如果您使用的是 SQL 2008,则更改数据捕获

【讨论】:

  • 是的,我的目标是尽可能少的在生产系统上花费时间,以减少对系统的影响。对于临时表,这是某种临时表吗?我使用的是 SQL 2008。我需要执行 ETL 的表范围从 100k 到 2000k 行。如果我的 ETL 进程读取读取 100k + 行,其中标识号小于特定数字,而我每秒同时向表中插入 30 多行,则可以判断性能影响。
  • 将 200 万行拉入暂存只需要几分钟。我刚刚在不到 4 分钟的时间内,通过我的 4GB RAM 笔记本电脑将 150 万行从开发盒中提取到 SQL 2008 开发盒中。所有机器都会比生产慢得多。更新性能还取决于编码和性能调优。但是,你的音量应该没问题。
  • 感谢您的信息。它可能会改变我们如何进行 ETL 的策略。我假设您使用存储过程来执行 ETL,因为它听起来非常快。我们使用 C#,它的数据访问层会减慢 ETL 过程。使用 C# 应用程序的优点是我们可以进行复杂的转换并且更容易调试,但性能可能是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多