手动刷新动态表

Manual refresh of dynamic tables with the scheduler enabled

您可以手动刷新动态表以包含最新数据,而无需等待下一次 计划刷新。这对于一次性更新或当表存在较大目标延迟且下一次刷新发生得更晚时非常有用。

小技巧

避免对具有下游动态表的动态表频繁执行手动刷新,这些下游动态表会根据目标延迟自动刷新。这类手动刷新可能会导致计划的刷新跳过,并阻止下游表更新。

要手动刷新,请使用 ALTER DYNAMIC TABLE ... REFRESH 命令或 Snowsight,如以下步骤所示:

ALTER DYNAMIC TABLE my_dynamic_table REFRESH

对于需要精确刷新时间的情况,例如使刷新与外部系统计划或批处理窗口保持一致时,您可以使用带有 CRON 表达式的任务来触发刷新。

例如:

-- Create the task
CREATE TASK my_dt_refresh_task
  WAREHOUSE = my_wh
  SCHEDULE = 'USING CRON 0 0 * * * America/Los_Angeles' -- Example: daily at midnight PST
  COMMENT = 'Daily 5pm PT manual refresh of my_dynamic_table'
  AS
    ALTER DYNAMIC TABLE my_dynamic_table REFRESH;

-- Enable the task
ALTER TASK my_dt_refresh_task RESUME;

-- Show the task
SHOW TASKS LIKE 'my_dt_refresh_task';
+------------+-----------------+-------------------------------------+---------------+-------------+--------------+-------------------------------------------------+-----------|-------------------------------------------+------------------+---------+----------------------------------------------+-----------+-----------------------------+-------------------+-------------------------------|-------------------+-----------------+--------+---------------------+-----------------------+---------------------+-----------------+----------------------------+-----------------+
| CREATED_ON | NAME            | ID                                  | DATABASE_NAME | SCHEMA_NAME | OWNER        | COMMENT                                         | WAREHOUSE | SCHEDULE                                  | [ ] PREDECESSORS | STATE   | DEFINITION                                   | CONDITION | ALLOW_OVERLAPPING_EXECUTION | ERROR_INTEGRATION | LAST_COMMITTED_ON             | LAST_SUSPENDED_ON | OWNER_ROLE_TYPE | CONFIG | TASK_RELATIONS      | LAST_SUSPENDED_REASON | SUCCESS_INTEGRATION | SCHEDULING_MODE | TARGET_COMPLETION_INTERVAL | EXECUTE_AS_USER |
|------------+-----------------+-------------------------------------+---------------+-------------+--------------+-------------------------------------------------+-----------+-------------------------------------------+------------------+---------+----------------------------------------------+-----------+-----------------------------+-------------------+-------------------------------+-------------------+-----------------+--------+---------------------+-----------------------+---------------------+-----------------+----------------------------+-----------------|
| 2025-10-02 | DT_REFRESH_TASK | 01bf6f0d-690f-f373-0000-000000025e3d| mydb          | my_schema   | ACCOUNTADMIN | Daily 5pm PT manual refresh of my_dynamic_table | mywh      | USING CRON 0 17 * * * America/Los_Angeles | []               | Started | ALTER DYNAMIC TABLE my_dynamic_table REFRESH | null      | false                       | null              | 2025-10-02 05:08:52.897 +0000 | null              | ROLE            | null   | {"Predecessors":[]} | null                  | null                | null            | null                       | null            |
+------------+-----------------+-------------------------------------+---------------+-------------+--------------+-------------------------------------------------+-----------|-------------------------------------------+------------------+---------+----------------------------------------------+-----------+-----------------------------+-------------------+-------------------------------|-------------------+-----------------+--------+---------------------+-----------------------+---------------------+-----------------+----------------------------+-----------------+

在大多数情况下,Snowflake 建议使用目标滞后,这样可以优化刷新频率,并相比固定 CRON 计划(可能会进行不必要的运行)可以降低成本。

Manual refresh of dynamic tables with the scheduler disabled

Dynamic tables with the SCHEDULER attribute set to DISABLE can only be refreshed manually.

This type of manual refresh refreshes only that dynamic table. It doesn't cascade to any upstream dynamic tables, regardless of their scheduler state.

In the DYNAMIC_TABLE_REFRESH_HISTORY output, the REFRESH_TRIGGER value for these refreshes is MANUAL. No SCHEDULED entries are generated for dynamic tables with SCHEDULER set to DISABLE.

This behavior allows external orchestrators, such as dbt, to issue one manual refresh per dynamic table without triggering upstream refreshes.

To disable the scheduler and then manually refresh a dynamic table, use the ALTER DYNAMIC TABLE command as shown in the following steps:

  1. Disable the scheduler:

    ALTER DYNAMIC TABLE my_dynamic_table SET SCHEDULER = DISABLE
    
  2. Manually refresh the dynamic table:

    ALTER DYNAMIC TABLE my_dynamic_table REFRESH