在 Flink SQL 中,虽然 (如 )和 (即 Deduplication 专门语法)在最终业务结果上都可以实现“去重”的效果,但 Flink Planner 对这两种语法的解析、生成的物理执行计划、状态管理策略以及整体性能有着本质的区别。 在实时流处理场景中,官方强烈推荐使用 来实现去重。 以下是这两者在 状态保留策略 和 性能 上的详细对比: --- 一、 状态保留策略 (State Retention Strategy) 的区别 流式去重的核心痛点是“状态无限膨胀”,因为系统需要记住“已经见过的数”。两者在清理状态的机制上差异巨大。 1. 使用 关键字 机制:Flink 会将其翻译为普通的 操作。为了判断一条数据是否重复,Flink 必须在状态中保存所有出现过的数据(即所有的去重键)。 状态清理: 完全依赖全局的 State TTL()来清理状态。 如果不设置 TTL,状态会随着时间无限膨胀,最终导致 OOM 或 Checkpoint 失败。 如果设置了 TTL,当一条数据的状态过期被清理后,如果再来一条相同的数据,Flink 会认为它是“新数据”从而再次向下游发送,导...