提高动态表增量刷新比例
看到某次刷新的
refresh_mode 是 FULL 不用慌。动态表每次刷新时,引擎会按成本自动在增量和全量之间选择——走没走增量,不能只看你写的 SQL 算子来猜,要以刷新历史里的 refresh_mode 为准。本文讲怎么判断、什么情况会走全量、以及怎么尽量保住增量。
先学会看刷新模式
用
SHOW DYNAMIC TABLE REFRESH HISTORY 看每次刷新,重点是三个字段:
:这次刷新的方式。refresh_mode
:只处理了变化的部分。INCREMENTAL
:整张表重新计算了一遍。FULL
:上游没有新变化,这次什么都没算——是正常状态,不是异常。NO_DATA
:增量刷新改动了多少行,如stats
。{"rows_deleted":"1","rows_inserted":"1"}
:这次刷新的耗时,用来判断刷新间隔是否够长、有没有积压。duration
字段全集见查看动态表刷新模式。
别想当然:这些写法仍走增量
最容易踩的误区,是凭"我用了某个算子,所以肯定退全量"下结论。很多被传为"不支持增量"的写法,实际仍然走增量。
以
ORDER BY 为例:
两次刷新都是增量:
| 刷新 | refresh_mode | stats |
|---|---|---|
| 建表后首次 | | |
| 新增 1 行后 | | |
ORDER BY 并没有让它退全量。同样,窗口聚合 SUM(...) OVER (PARTITION BY ...)、聚合的撤销(退款把金额减回去)、ROW_NUMBER() 取每键最新(rn = 1)这些写法,刷新时也都走增量。所以结论只有一个:别凭算子猜,跑一次看 refresh_mode。
什么情况会走全量
走全量有两类原因,性质完全不同。
一、引擎按成本主动选了全量(最常见)。 引擎判断"这次全量比增量更划算"时就会走全量,典型情况是:数据量很小(全量本来就便宜)、单次变更占了全表很大比例、或者多表
JOIN、宽表这类增量代价偏高的场景。这不是"不支持增量",而是"这次没必要增量"。
一个直接后果:在几行测试数据上很容易看到
,到了生产数据量反而走增量。 例如一张两表关联的宽表,建好后第一次变更常常走 FULL
FULL,之后的小幅变更才转 INCREMENTAL。所以别用小数据集的刷新模式去推断生产表现。
二、改了定义后的一次重算。 用
CREATE OR REPLACE 改了加工逻辑(改 SELECT、新增计算列、改列类型)后,引擎会触发一次重算来对齐新定义。定义稳定下来之后,后续刷新照常走增量。
怎么尽量保住增量
- 用真实数据量评估:别在几行测试数据上判断增量效果,小数据下引擎会主动选全量,看到
是正常的。FULL - 让定义稳定:频繁
改定义会反复触发重算,逻辑定型后再上线。CREATE OR REPLACE - 控制单次变更占比:一次性灌入接近全表规模的数据,会让增量不划算而退全量;细水长流的持续变更最适合增量。
- 给引擎可利用的聚集性:让
、JOIN key
、分区键能区分冷热数据,引擎才能只碰相关数据。原理见增量计算机制与动态表。GROUP key - 拿不准就跑一次看:以
为准,不要凭算子或旧印象下结论。refresh_mode
相关文档
- 查看动态表刷新模式:
字段全集SHOW DYNAMIC TABLE REFRESH HISTORY - 增量计算机制与动态表:增量原理与各算子的增量行为
- 动态表设计方法:从加工目标到增量管道:四种加工形态及各自的刷新特征
- 动态表中的非确定性函数:它们不会让刷新退全量,但会造成行间值不一致
- 动态表(Dynamic Table):对象概念、命令与限制
联系我们
