未使用时间旅行的Snowflake动态表刷新时为何出现时间旅行错误?
问题
在Snowflake中,我有一张动态表TFM_DIM_DATE,它通过自连接DIM_DATE表补充部分字段。动态表定义里从未尝试读取DIM_DATE的历史版本,但关闭DIM_DATE的时间旅行后,刷新动态表时出现以下错误:
Database Error in model tfm_dim_date: SQL compilation error: Failed to refresh dynamic table with refresh_trigger INITIAL at data_timestamp 1743671890105 because of the error: SQL compilation error: Target table failed to refresh: Time travel data is not available for table DIM_DATE. The requested time is either beyond the allowed time travel period or before the object creation time.
动态表的简化定义如下:
create or replace dynamic table TFM_DIM_DATE( DATE_KEY, FULL_DATE, ...etc ) target_lag = '10 minutes' refresh_mode = AUTO initialize = ON_CREATE warehouse = DAGSTER_PRD_WH as ( SELECT DTE.DATE_KEY, DTE.FULL_DATE, ...etc FROM DIM_DATE AS DTE INNER JOIN DIM_DATE AS DTE_MTH ON DTE.MONTH_END_DATE = DTE_MTH.FULL_DATE INNER JOIN DIM_DATE AS DTE_QTR ON DTE.QUARTER_END_DATE = DTE_QTR.FULL_DATE INNER JOIN DIM_DATE AS DTE_PRV_QTR ON DTE.PREVIOUS_QUARTER_END_DATE = DTE_PRV_QTR.FULL_DATE );
请问为何会出现该时间旅行错误?
原因分析
- Snowflake动态表的增量刷新机制依赖时间旅行功能追踪源表(
DIM_DATE)的数据变化。即便你没有在查询中显式调用历史版本,动态表内部会自动记录上一次刷新的时间戳,下一次刷新时会请求源表在该时间点的状态,以此计算增量数据。 - 当你关闭
DIM_DATE的时间旅行(例如设置DATA_RETENTION_TIME_IN_DAYS = 0),该表不再保留历史版本数据。动态表刷新时请求的时间戳(错误信息中的1743671890105)超出了DIM_DATE的可用时间范围,因此触发错误。 - 另外,动态表的
INITIAL刷新触发(首次创建时的初始化)需要源表的完整数据快照,若此时源表时间旅行已关闭,且初始化请求的时间戳对应的版本已被清理,也会导致该问题。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

