(代表雪花用户提交 - 希望找到加快解决速度的解决方案(
我们正在研究使用流来实现一个缓慢变化的维度。
以下文章很有帮助,但我们希望找到一种方法来构建更详尽的更改捕获?
- https://www.snowflake.com/blog/building-a-type-2-slowly-changing-dimension-in-snowflake-using-streams-and-tasks-part-1/
- https://community.snowflake.com/s/article/Building-a-Type-2-Slowly-Changing-Dimension-in-Snowflake-Using-Streams-and-Tasks-Part-2
请考虑以下示例:
1(Insert into MyTable row 1
2(Select * from StreamOfMyTable
<====== 按预期返回插入
3(Update MyTable where Row = 1
4(Select * from StreamOfMyTable
仅显示净变化,一个插入 ,包含步骤 3 中的更新值。如果我们要在此处使用流,则无法知道第 1 行曾经具有步骤 1 中给定的值。
在步骤 4 中,我们希望在流中看到步骤 1 中的原始插入和步骤 3 中的更新。这样我们就可以构建更完整的 SCD 类型 2,而不仅仅是使用 DML 操作使用流时的净变化。
我们确实看到了如何通过时间旅行,通过使用"before(语句=>'my query guid'("短语来创建新的StreamOfMyTableAtSpecificPointInTime。但这似乎很极端,必须为我们所有的表编码。有没有更原生的方式来捕获所有更改?
注意:
被问到"为什么需要行的先前值来构建 SCD 类型 2?您应该能够根据某个 ID 合并到最终维度中,并更新上一条记录以"关闭它",对吗?以前的值应该在你的最终维度中吗?
我的回答是:"流不包含对同一行的多次更改,只包含对它的净更改。在处理流之前,请尝试多次更新行。请注意,流中只有最终值。
关于如何进行的任何建议?
简单地说,你描述的行为就是 Streams 在 Snowflake 中的工作方式。 它们不被考虑和审计记录的表。
您可以运行任务并以较小的间隔处理流,但如果源表上有多个更改,则在处理流时,流中只有 DML 操作网络可用。
对于给定的唯一记录,您希望源表中的更新速度有多快?
插入和更新来自哪里?
如果要构建 SCD 系统,则应该能够从源获取所有更改(插入、更新和删除(。
然后,不应直接将这些更改应用于目标表,并尝试使用流捕获它们,而应将更改本身记录在事件表中,并直接从事件计算 SCD。
2022 年 9 月,Snowflake 添加了 SYSTEM$STREAM_BACKLOG 函数,允许用户检索流的当前偏移量和当前时间戳之间的表版本集。
每个表版本代表一个 DML 操作(INSERT
、UPDATE
、DELETE
或TRUNCATE
(,因此您应该能够将每个版本(一次一个(处理到 SCD 表中。