了解动态表目标滞后

动态表刷新是根据数据的过时程度触发的,这种过时程度通常称为目标滞后。您可以指定固定的目标滞后,或将表设置为 DOWNSTREAM,使其刷新时间由依赖于它的其他动态表决定。

动态表的目标滞后是相对于图表根中的动态表来衡量的,而不是直接上游的动态表。要查看连接到动态表的表图形,请参阅 使用 Snowsight 检查动态表的图

Snowflake 计划刷新,使动态表的实际滞后低于目标滞后。每次刷新的持续时间取决于查询、数据模式和仓库规模。选择目标滞后时,请考虑将 链中的每个动态表 刷新到根所需的时间。否则,系统可能会跳过一些刷新,从而导致更高的实际滞后。

上游和下游关系如何影响目标滞后

下图说明了在与其他动态表的上游和下游关系的上下文中执行的暂停、恢复和手动刷新操作。

动态表之间的关系。用于帮助说明暂停、恢复和手动刷新。

该图描述了使用动态表构建的简单声明性数据管道:

  • DT2 被描述为 DT1 的 下游,因为它依赖于该动态表,并被描述为依赖于它的 DT3 的 上游

  • DT3 是 DT2 和 DT1 的下游,因为它直接依赖于 DT2、间接依赖于 DT1。

  • DT1 直接或间接位于其他动态表的上游。

目标滞后的类型

目标滞后通过以下方式之一指定。目标滞后与动态表的刷新频率成反比:频繁刷新意味着较低的滞后。

  1. 新鲜度度量:定义动态表内容滞后于基表更新的最长时间。

    以下示例将 my_dynamic_table 设置为每小时刷新一次并保持新鲜度:

    ALTER DYNAMIC TABLE my_dynamic_table SET TARGET_LAG = '1 hour';
    
    Copy
  2. 下游:指定当其他从属动态表刷新时,动态表应按需刷新。此刷新可以通过 :ref:` 创建时的初始化 <label-dynamic_tables_initialization>`、手动刷新 或下游动态表的 计划刷新 触发。

    在下面的示例中,my_dynamic_table 设置为基于其下游动态表的目标滞后进行刷新。如果 my_dynamic_table 没有任何依赖于它的动态表,则它不会刷新。

    ALTER DYNAMIC TABLE my_dynamic_table SET TARGET_LAG = DOWNSTREAM;
    
    Copy

确定动态表的最佳目标滞后

您设置的目标滞后会影响动态表的 计划刷新 频率。

Snowflake 会将刷新安排在略早一些的时间,以留出时间完成刷新。例如,如果您将目标滞后设置为 5 分钟,这并不代表表会确切按照每 5 分钟一次的间隔刷新。实际刷新间隔可能要比指定的滞后时间短。如果您希望更一致地实现 5 分钟刷新一次,请考虑稍微增加目标滞后。

您可以在 INFORMATION_SCHEMA 或 Snowsight 中使用 DYNAMIC_TABLE_REFRESH_HISTORY 表函数,按照自己的需求确定最佳目标滞后时间。例如,分析刷新细节,包括持续时间和跳过的刷新,以做出明智决定。

有关监控动态表刷新和故障排除的信息,请参阅 关于监控动态表动态表故障排除

DYNAMIC_TABLE_REFRESH_HISTORY 函数返回有关动态表每次刷新的信息,包括刷新所花费的时间以及哪些刷新被跳过。

SELECT
    name
FROM
  TABLE (
    INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY (
      NAME_PREFIX => 'MYDB.MYSCHEMA.', ERROR_ONLY => TRUE
    )
  );
Copy

其输出会反映随时间变化的刷新情况。每一行代表一次刷新。每次动态表刷新时,都会添加一行新数据。

更改目标滞后

您可能希望根据以下任何原因调整动态表的目标滞后:

  • 您需要更为及时的数据。减少目标滞后可确保动态表更频繁地刷新,提供更接近实时的新数据。

  • 您想优化资源。增加目标滞后可以降低刷新频率,从而节省计算资源,这对于不需要持续更新或数据变化不频繁的工作负载非常有用。例如,如果动态表每 20 分钟刷新一次,但只需要在源表发生变化的一小时内刷新,则设置一小时的目标滞后可以降低成本。

  • 您希望目标滞后与数据管道一致。如果您的动态表依赖于其他刷新间隔更长的表,调整目标滞后可确保其与依赖项一致。

要更改目标滞后,请使用 ALTER DYNAMIC TABLE 命令。有关更多信息,请参阅 更改动态表的仓库或目标滞后

示例:动态表链的目标滞后

考虑以下示例,其中动态表 (DT2) 从另一个动态表 (DT1) 读取数据,以物化其内容。在这种情景下,报告通过查询使用 DT2 的数据。

两个动态表的简单示例,DT2 基于 DT1 定义。

可能出现以下结果,具体取决于每个动态表指定其滞后的方式:

动态表 1 (DT1)

动态表 2 (DT2)

刷新结果

TARGET_LAG = DOWNSTREAM

TARGET_LAG = 10minutes

DT2 至少每 10 分钟更新一次。DT1 从 DT2 推断其滞后,并在每次 DT2 需要更新时都会更新。

TARGET_LAG = 10minutes

TARGET_LAG = DOWNSTREAM

应避免这种情况。报告查询不会收到任何数据。DT1 频繁刷新,DT2 不会刷新,因为没有基于 DT2 的动态表。

TARGET_LAG = 5minutes

TARGET_LAG = 10minutes

DT2 大约每 10 分钟使用 DT1 的数据更新一次,而后者最多 5 分钟更新一次。

TARGET_LAG = DOWNSTREAM

TARGET_LAG = DOWNSTREAM

由于 DT1 和 DT2 都有下游滞后,并且都没有已定义滞后的下游使用者,因此它们都不会定期刷新。

语言: 中文