将 "Delta" 数据从高度事务性数据库拉入分析数据库的最佳方法是什么?

What is the best approach to pull "Delta" data into Analytics DB from a highly transactional DB?

从高度事务性数据库中仅将增量加载到分析数据库中的最佳方法是什么?

注意: 我们有一个高度事务性的系统,我们正在从中构建一个分析数据库。目前,我们正在从分析数据库中删除所有事实表和维度表,并在午夜加载整个 "processed" 数据。这种方法的问题在于,我们每次都一次又一次地加载相同的数据以及在特定日期获得 added/updated 的少数新数据。我们需要单独加载 "Delta"(新插入的行和更新的旧行)。有什么有效的方法吗?

不知道细节就很难说出一些事情,例如。数据库模式、数据库引擎……然而对我来说最自然的方法是使用时间戳。此解决方案假定从事务数据库 loaded/migrated 到分析数据库的实体(table 中的单个记录或一组相关记录)具有时间戳。

此时间戳表示上次创建或更新给定实体的时间。虽然 loading/migrating 数据您应该只考虑每个 时间戳 > 上次迁移日期 的这些实体。这种方法的优点是非常简单,不需要任何特定工具。问题是您的数据库中是否已经有时间戳。

另一种方法可能是利用某种更改跟踪机制。例如 MMSQL 服务器有类似的东西(参见 article)。但是,我不得不承认我从未使用过它,所以我不确定在这种情况下它是否是 suitable 。如果你的数据库不支持变更跟踪,你可以尝试基于触发器自己创建它,但一般来说这并不容易。

We need to load the "Delta" alone (rows which are inserted newly & the old rows which got updated). Any efficient way to do this?

您忘记了已删除的行。这就是问题的症结所在。在每个 table 上有一个 updated_at 字段并轮询具有 updated_at > @last_poll_time 的行,或多或少是有效的,但是像这样的轮询不会给你一个交易盟友一致的图像,因为每个 table 在不同的时刻进行投票。跟踪 已删除 行会在 app/data 模型层引发复杂情况,因为行必须被逻辑删除 (is_deleted) 或移动到存档 table (每个 table!).

另一种解决方案是在数据库中写入触发器,将触发器附加到每个 table,然后让触发器将发生的更改写入 table_history。同样,对于每个 table,。众所周知,这些解决方案很难在存在架构更改(添加、修改列、table 删除等)的情况下长期维护

但是有特定于数据库的解决方案可以提供帮助。例如 SQL 服务器有 Change Tracking and Change Data Capture。这些可用于构建维护分析数据仓库的 ETL 管道。不过,数据库架构更改仍然很痛苦。

没有银弹,没有仙尘。