1

我有以下情况

  • ETL 将数据加载到 DW 中。
  • 报告按需运行,可能与 ETL 同时运行,使用来自 DW 的数据。

这是我的问题:我需要确保报告不包含部分数据:

  • 如果 ETL 准备好加载数据时正在运行报告,则 ETL 必须等待报告完成。
  • 如果正在加载 ETL 并请求报告,则报告必须等待 ETL 完成。
  • 如果 ETL 正在等待加载并请求报告,则报告必须等待 ETL 运行并完成 - ETL 始终优先于报告。

获得这个的最佳机制是什么?数据库锁似乎不够智能,无法管理我需要的优先级。

我应该实现自己的锁定机制吗?如果是,是否有众所周知的设计?必须考虑许多事情:跟踪当前正在运行的报告(读取锁定),在 ETL 通知它完成失败的情况下实施锁定到期,等等。

4

2 回答 2

1

如果您使用的是 Cognos,那么我认为您基本上不走运,因为“如果 ETL 正在运行,则阻止报告运行”这种设置,除非您想在记录不充分的 API 中捣乱。

您最好的选择是确定特定报告,通常是针对聚合运行的报告,并确保您设置 ETL 流程以最后更新事实和聚合,并将其作为一个大的“更新”事务。如果您使用可以提供读取一致性的 dbms,您应该能够做到这一点,而不会显示仅加载一半数据的报告。

访问多个事实/多个聚合的报告会更麻烦。甚至可能您可能必须设置某种“表格交换”,在其中构建您需要的内容然后alter table rename换出表格。

于 2012-08-22T20:27:27.337 回答
0

您可以让 etl 进程在启动时在表的记录中设置标志,并在完成时取消设置?然后,报告系统可以查询此表以查看是否设置了标志并通知用户仓库正在运行,并将报告放入队列中,以便在 ETL 过程完成时处理,或者告诉用户稍后再试。如果您想允许用户使用已处理的事实,您的标志表将需要位于表粒度上 - 即在每个表的标志记录上。

于 2012-08-31T08:23:59.120 回答