【发布时间】:2020-12-04 06:02:07
【问题描述】:
我们主要使用 Informatica PowerCenter 将数据从其他关系数据库迁移到我们的数据仓库中。我来了 使用简单的算法将数据移动到星型模式或使用变更数据捕获的任何物化视图中,以及 想知道它有什么问题,以便更好地了解 Informatica 等工具的吸引力。
假设:
- 我们有一个 CDC 消息通道,各个插入/更新/删除事件通过该通道到达。
- 我们已将感兴趣的物化视图定义为针对源表的聚合 SQL 查询。换句话说,它是 包含 GROUP BY 表达式的 SQL 查询。因此,物化视图保证具有一致的 粒度,可以将 GROUP BY 表达式的内容作为其主键。
算法:
-
一个 CDC 消息通过该通道。源表行已更改:
我们遍历所有依赖于该表的查询。对于每个查询,我们确定表是否是“主”表 或此特定查询的“非主要” - 例如查询的 GROUP BY 中是否使用了此表中的值 表达。也就是说,我们判断物化视图的PK是否直接依赖于这张表。
- 主表已更改:
-
插入了一个主表行,其值为 P=p:
- 将原始行插入到源表的镜像中。
- 使用过滤器 WHERE P=p 运行感兴趣的查询并找到受影响的行。
- 将受影响的行插入到我们的物化视图表中。
-
主表行已更新,值 P=p1 更改为 P=p2:
我们将其拆分为两条消息:DROP P=p1(见下文)和 INSERT P=p2(见上文)。
-
删除了值为 P=p 的主表行:
- 只选择 PK 值和过滤器 WHERE P=p 来运行感兴趣的查询以查找 受影响的 PK 值(pk1、pk2、...、pkn)。
- 删除源表镜像的原始行。
- 从实体化视图表中删除 WHERE PK IN (pk1, pk2, ..., pkn) 行。
-
- 非主表已更改:
-
插入了一个具有相关值 V=v 的非主表行:
- 将原始行插入到源表的镜像中。
- 使用过滤器 WHERE V=v 运行感兴趣的查询,并找到受影响的 PK 值(pk1、pk2、...、pkn)。
- 使用过滤器 WHERE PK in (pk1, pk2, ..., pkn) 运行感兴趣的查询并更新这些行 在物化视图表中。
-
更新了非主表行,相关值从 V=v1 更改为 V=v2:
我们将其拆分为两条消息:DROP V=v1(见下文)和 INSERT V=v2(见上文)。
-
删除了相关值 V=v 的非主表行:
- 只选择 PK 值和过滤器 WHERE V=v 来运行感兴趣的查询以查找 受影响的 PK 值(pk1、pk2、...、pkn)。
- 从我们的源表镜像中删除原始行。
- 使用过滤器 WHERE PK in (pk1, pk2, ..., pkn) 运行感兴趣的查询并更新这些行 在物化视图表中。
-
- 主表已更改:
让它变得更好:
- 物化视图表的任何更新本身都可以转换为 CDC 消息。这将允许 对依赖于其他物化视图的物化视图进行递归更新。
如果这样的解决方案能够真正发挥作用并且快速且可扩展,那么它可以解决我们 80% 的 ETL 问题。然而, 我不可能是第一个想到这种幼稚方法的人,所以请告诉我为什么这行不通。
【问题讨论】:
-
您好 - 您正在征求意见,因此您的问题不在本论坛的范围内。然而,很多人编写自己的 ETL 框架(现在通常使用 Python),这样做有好有坏。考虑一下如何使用您的框架管理复杂的数据转换、数据沿袭、数据治理、数据质量、不同类型的源数据等
-
感谢您的回复,@NickW!
-
更具体地说,我正在寻找我的算法中的逻辑错误和性能错误(是否有我错过的全表扫描?)(这实际上只是一个算法而不是完整的框架),我认为可以客观地回答。只要有 GROUP BY 子句,我想不出算法不能处理任意复杂的数据转换的原因。数据沿袭是微不足道的,因为算法已经依赖它。您提出的其他问题超出了范围,因为这不是一个完整的框架。
-
嗨 - 很高兴被证明是错误的,但我怀疑你会从这个网站得到有用的回应,因为它真的是为了帮助解决实际的编码问题而不是伪代码/理论算法。随意根据您的算法实施一个实际的解决方案,然后如果某些事情没有按预期工作并且您需要帮助解决它,请提出具体问题
标签: relational-database etl data-warehouse