- [P20260217-003557] 2026-02-17 00:35:57 +0800 - summary: 2、优化方案方案 0:决策基线(推荐)保留 ODS 多版本追加(PK = (id, content_hash)),但把“无意义重复版本”压掉、把“取最新版本”跑快、把 spec 误导项清理掉。方案 1:清理 spec 中“误导/无效配置”(… - prompt: ```text 2、优化方案方案 0:决策基线(推荐)保留 ODS 多版本追加(PK = (id, content_hash)),但把“无意义重复版本”压掉、把“取最新版本”跑快、把 spec 误导项清理掉。方案 1:清理 spec 中“误导/无效配置”(纯重构,不改运行语义)删除 conflict_columns_override运行时不生效(冲突列来自 DDL),保留只会误导新人以为它决定去重逻辑。PK 信息应只有一个权威来源:DDL。更新数据库与DDL.软删除策略字段标准化:用枚举替代组合字段把 snapshot_full_table + snapshot_window_columns 合并成一个枚举(外加可选时间列):NONE:不做软删除FULL_TABLE:全表快照 diffWINDOW:窗口快照 diff(需要时间列)好处:配置更可读,__post_init__ 校验更清晰,减少“组合状态爆炸”。删除全局恒定的冗余字段include_site_column/include_page_no/include_page_size 全部 False → 直接硬编码include_source_endpoint 少数 True → 保留但默认 False以上属于“让 spec 说人话”,不改表结构不改数据,只减少误解成本。方案 2:减少“无意义版本”——默认开启 skip unchanged(轻度改行为,但更符合多版本语义)把 enable_content_hash_dedup 改名成更直观的 skip_unchanged(或保留原名但改注释),并考虑:默认改为 True(强烈建议)逻辑:内容没变就不新增版本;内容变了依然会插入新行(多版本语义不受影响)这能直接解决你们最烦的“版本膨胀里混了很多无变化重复”的问题。方案 3:给“取最新版本”提供索引与标准写法(性能关键)每张 ODS 表加复合索引:(business_id, fetched_at DESC)(business_id 指各表主业务主键列)。目标查询模式通常是:“每个 id 取最新一行”“按时间增量抽取 + 每 id 最新”没索引会导致排序/去重代价大;有索引后能极大减少扫描与排序成本。业务下游是需要“最新且未删除”,所以:维护一个 latest 视图/物化视图(例如 ods_x_latest),统一封装 DISTINCT ON / window function 逻辑。或者在 DWD 落地时统一做“latest 快照表”,让业务查询不直接扫 ODS 多版本表解决的不是多版问题,而是“没有为最新版本访问模式建索引”问题。方案 4:软删除语义在多版本下的“规约”已经指出:多版本下软删除会出现“多行一起标删”的复杂性。但我认为删除也使更新的一种,应该是新增一行,记录为改ID的最新记录,本记录的is_delete = 1ODS 层语义:业务实体被删 → 该id的最新版本 is_delete=1 合理。下游取数规约(给 DWD/数仓同事一个确定的规则):先按 id 取 latest(按 fetched_at)再过滤 is_delete=0(或者反过来,但要统一)此举会带来一个问题,Hash不能单纯计算Payload,还需要把综合判断后的is_delete判断进去。方案 5:中长期治理冷数据归档例如保留最近 90/180 天的历史版本;更早版本移到归档表或冷存储(如果合规允许)。目的不是省磁盘,是减少索引膨胀、vacuum 压力、备份恢复时间。版本保留策略(按表分级)维度表:可能只需要少量版本(比如仅保留变更点)流水/事实:可能需要更长版本链可以按任务 spec 增加 retention_days / retain_versions 之类,但这是后话,先把现有的跑稳。--------------以上表达是否有问题? ```