练习表 4:迁移波次方案
把十个 NYC 出租车对象排入迁移波次,并为每一个评定复杂度,每个答案都有即时反馈。
预计耗时: 15–20 分钟 参考资料: 执行顺序见 模块 03,provision 与迁移 → 模块 04,重建 dbt 管道 → 模块 05,基准测试与切换
概念
数据库对象之间存在依赖。一个查询 fact_trips 的视图不可能在
fact_trips 存在之前创建。一个从 trips_raw 读取的物化视图不可能在
trips_raw 有数据之前完成填充。顺序搞错会导致建表
失败、结果为空,或者出现难以诊断的不完整数据。
解决办法:波次规划。 把每个对象编入带编号的波次,每个 波次只包含依赖已被前面波次满足的对象。
复杂度评级有助于安排迁移投入的优先级。B 与 C 之间的界线在于 一个语句是必须重构,还是只需重新写类型:
- A 级:简单:标准表或直通视图,没有特殊逻辑, 类型映射直截了当
- B 级:中等:有一个需要学习和测试的 ClickHouse 专有构造,但
翻译本身只是一次替换,一个 ClickHouse 引擎加增量配置、一个
CREATE DICTIONARY、可刷新 MV 的REFRESH EVERY,或者用一个JSONExtract*路径 顶替一次VARIANT读取 - C 级:复杂:语句必须重建,而不只是重新写类型(
QUALIFY包进子查询、MERGE INTO换成增量策略),并且这次 重写还必须与引擎选择以及下游各处的FINAL放置位置保持 一致;要仔细测试 - D 级:需要重新设计:Snowflake 专有特性,没有直接等价物 (Streams → 生产者切换到 ClickHouse,Tasks → 可刷新 MV 或定时 dbt 运行)
下面的练习 3 要求你用压缩后的三档标准来评级,而不是上面的四个 字母,Low(A 级)、Medium(B 级)、High(C 级或 D 级),因为 对排期投入最重要的区分是简单 / 需要测试 / 需要重新设计,而不是四分法。每个答案的解释都会指明对应 A–D 中的哪一档, 所以你依然可以映射回字母等级。
练习 1:依赖 DAG
对下面每个对象,选出它依赖什么。十个中有三个是静态参考 数据,完全没有依赖,那是一个真实答案,不是留待以后填补的空缺。
练习 2:迁移波次分配
波次 0 和 1 已作为上下文填好。对波次 2 到 4,选出属于该波次的 对象,然后回答其中实际发生了什么。
练习 3:复杂度评级
为每个对象评级,然后回答表格下方关于它主要挑战的问题。
反思问题
最后两个问题涉及答案参考中风险登记表的三个条目,
在 fact_trips(C 级)和 agg_hourly_zone_trips 落地之后对它们进行验证,以及
验证替换 TRIPS_CDC_STREAM 和 CDC_CONSUME_TASK 的生产者切换
(D 级)。这份登记表并不就等于 C 级/D 级的集合:agg_hourly_zone_trips 评为
Medium,但它的滚动重算窗口是这条管道中最容易在细微处
出错的东西。
Loading worksheet...
转录到 migration-plan.md
把你的波次方案和复杂度评级抄到 migration-plan.md 的第 6 节,并
勾选:
- [ ] Migration wave plan: completed