了解动态表初始化和刷新¶
动态表的内容由查询定义,并在基础数据发生变化时自动更新,这种更新被称为 刷新。此过程会分析查询,以使表保持最新状态。
以下各部分更详细地解释了动态表刷新:
部分 |
描述 |
---|---|
介绍初始化,换句话说,即创建动态表时的数据初始填充。您可以指定何时进行初始刷新。 |
|
动态表刷新的概述。动态表根据计划刷新,除非手动刷新。 |
|
动态表支持两种刷新模式:增量刷新和完全刷新。您可以将刷新模式设置为 AUTO 或显式设置它。 学习选择刷新模式的最佳实践以及如何查看所使用的刷新模式。 |
|
了解动态表如何根据其依赖关系进行刷新。 |
|
了解基表变更产生的影响。 |
|
动态表刷新的最佳实践列表。 |
了解动态表初始化¶
当您 创建一个动态表 时,其初始刷新会在创建时同步发生或按照计划时间发生。初始数据填充或 初始化 取决于此初始刷新发生的时间。
动态表基于指定的 目标滞后 进行刷新,该滞后设置了基表更新与动态表内容更新之间的最大允许滞后。如果设置 INITIALIZE = ON_CREATE``(默认),则会立即初始化该表。如果设置 ``INITIALIZE = ON_SCHEDULE
,则初始化将在指定的目标滞后时间范围内发生。
例如,假设一个动态表名为 DT1
,其目标滞后为 30 分钟。DT1
的初始数据填充可能如下进行:
如果
DT1
设置为在创建时同步刷新 (ON_CREATE
),则会在创建时初始化。如果
DT1
设置为在计划时间刷新 (ON_SCHEDULE
),则它将在 30 分钟内初始化。
在具有下游依赖关系的场景中,刷新行为取决于依赖关系。例如,如果动态表 DT1
具有一个 下游 目标滞后,且依赖于 DT1
的 DT2
具有 30 分钟的目标滞后,那么 DT1
仅在 DT2
刷新时刷新。
对于 DT1
:
如果设置为在创建时同步刷新,它将立即初始化。如果初始化失败,则创建过程将停止,对任何错误提供即时反馈。
如果设置为在计划时间刷新,则初始化取决于
DT2
刷新时间。
初始化可能需要一些时间,具体取决于扫描的数据量。要跟踪进度,请参阅 动态表创建故障排除。
了解手动和计划刷新选项¶
动态表按 目标滞后 确定的计划进行刷新。每次读取动态表时,数据的新鲜度都应在目标滞后定义的时间范围内。
您可以使用 ALTER DYNAMIC TABLE ... REFRESH 命令或 Snowsight 手动刷新动态表以获取最新数据。有关更多信息,请参阅 手动刷新动态表。
动态表刷新超时由 STATEMENT_TIMEOUT_IN_SECONDS 参数控制,该参数设置在账户或仓库级别上刷新自动取消前的最大允许持续时间。
目标滞后如何影响计划刷新¶
目标滞后控制计划刷新的频率。要手动管理刷新,请将动态表的目标滞后设置为 DOWNSTREAM,并确保所有下游动态表也设置为 DOWNSTREAM。
将整个有向无环图 (DAG) 的目标滞后设置为 DOWNSTREAM,实际上会禁用计划刷新,因为最终的动态表会控制刷新计划。如果没有动态表具有基于时间的目标滞后,则管道的计划刷新将被暂停。在这种情况下,手动刷新最下游的表会自动刷新所有上游依赖关系。
将目标滞后设置为 DOWNSTREAM 不会指定确切的时间。相反,Snowflake 会选择一个刷新频率,尝试将滞后保持在目标值以下。例如,目标滞后为 4 小时的动态表可能每 3.5 小时刷新一次。
替代方案是:您可以使用带有 CRON 计划的任务。例如:
CREATE TASK my_task
SCHEDULE = 'USING CRON <expr> <time_zone>'
AS
ALTER DYNAMIC TABLE my_dynamic_table REFRESH;
动态表刷新模式¶
动态表支持两种刷新模式:增量刷新和完全刷新。您可以将刷新模式设置为 AUTO,也可以显式指定:
AUTO 刷新模式: 当您使用
AUTO
参数时,Snowflake 会根据查询复杂性、支持的结构、运算符、函数和预期性能,自动选择成本和时间效率最高的刷新模式。如果增量刷新不受支持或可能表现不佳,Snowflake 会自动选择完全刷新。增量刷新: 此模式会分析动态表的查询,并计算自上次刷新以来的变更。然后它会将这些变更合并到表中。
完全刷新模式: 此模式会执行动态表的查询,并完全替换先前实现的结果。
创建动态表后,您可以监控表,以 确定是使用增量刷新还是完全刷新来更新该表。
选择动态表刷新模式的最佳实践¶
您动态表的最佳模式取决于数据变化量和查询复杂性。此外,使用专用仓库测试不同的刷新模式有助于隔离成本,并根据实际工作负载改善性能调优。
AUTO 刷新模式:系统默认尝试应用增量刷新。当 增量刷新不受支持 或预计无法良好运行时,动态表会自动选择完全刷新。
我们强烈建议在大多数使用情况下使用
AUTO
,因为它允许 Snowflake 无需手动微调即可优化刷新行为。要保持一致的行为,请在所有生产表上显式设置刷新模式。AUTO
行为可能会在 Snowflake 版本之间发生变化,这可能会导致在生产管道中使用时性能出现意外变化。
增量刷新:仅使用自上次刷新以来的更改来更新动态表,非常适合频繁进行小更新的大型数据集。
最适合与增量刷新兼容的查询(例如,
SELECT
、WHERE
和GROUPBY
中的确定性函数、简单联接和基本表达式)。如果存在不受支持的功能,并且刷新模式设置为增量,Snowflake 将无法创建动态表。使用增量刷新优化性能的一个关键做法是将更改量限制为源数据的 5% 左右,并按分组键对数据进行聚类以减少处理开销。
考虑某些操作组合(例如许多联接基础上的聚合)可能无法有效运行。
完全刷新:重新处理整个数据集并使用完整的查询结果更新动态表。 用于复杂查询或有重大数据更改而需要完全更新的情况。
当由于复杂的查询、非确定性函数或数据的重大更改而不支持增量刷新时很有用。
要确定最适合您用例的模式,请尝试自动建议和具体的刷新模式(完整和增量)。
重要
增量刷新模式下的动态表不能是完全刷新模式下动态表的下游。这是因为增量刷新模式不兼容上游完全刷新表每次刷新时发生的完整行变更。
要验证动态表的刷新模式,请参阅 查看动态表刷新模式。
查看动态表刷新模式¶
您可在 创建动态表 时设置 刷新模式。创建后,您可以使用以下方法之一查看该动态表是使用增量刷新还是完全刷新,前提是您所使用的角色具备 必要权限:
执行 SHOW DYNAMIC TABLES 命令:
SHOW DYNAMIC TABLES;
在 输出 中:
text
列显示用户指定的刷新模式。refresh_mode
列显示实际刷新模式。refresh_mode_reason
显示选择实际刷新模式的原因。
在导航菜单中,选择 Monitoring » Dynamic Tables,然后选择您的动态表。
您可以在页面顶部的对象标题中查看动态表的刷新模式。对于完全刷新,将鼠标悬停在刷新模式上时可以看到刷新模式原因。
当动态表依赖于其他动态表时数据如何刷新¶
当动态表的滞后被设置为时间量度时,自动刷新流程会安排刷新,以更好地满足目标滞后时间。
为了在 一个动态表依赖于另一个动态表 的情况下保持数据一致,该过程会在合适的时间刷新账户中的所有动态表。刷新频率较低的时间与刷新频率较高的时间相吻合。如果刷新时间过长,调度程序可能会跳过刷新,以尽量保持最新状态。但是,快照隔离仍会保留。
例如,假设动态表 DT1
的目标滞后为两分钟,而查询动态表 DT2
的目标滞后为一分钟。该过程可能会确定 DT1
应每 96 秒刷新一次,而 DT2
应每 48 秒刷新一次。因此,该过程可能会采用以下时间表:
具体时间点 |
刷新的动态表 |
---|---|
2022-12-01 00:00:00 |
DT1、DT2 |
2022-12-01 00:00:48 |
DT2 |
2022-12-01 00:01:36 |
DT1、DT2 |
2022-12-01 00:02:24 |
DT2 |
这意味着在任何给定时间,当您查询一组相互依赖的动态表时,查询的是这些表中数据的相同“快照”。
请注意,动态表的目标滞后不能短于其所依赖的动态表的目标滞后。例如,假设:
DT1
查询动态表DT2
和DT3
。DT2
目标滞后为五分钟。DT3
目标滞后为一分钟。
这意味着 DT1
的目标滞后时间不得短于五分钟(即,不得短于 DT2
和 DT3
的滞后时间中较长的一个)。
如果将 DT1
的滞后设置为五分钟,该过程将设置具有以下目标的刷新时间表:
经常刷新
DT3
,使其滞后短于一分钟。经常同时刷新
DT1
和DT2
,使它们的滞后短于五分钟。确保
DT1
和DT2
的刷新在时间上与DT3
的刷新相吻合,以确保快照隔离。
重要
增量刷新模式下的动态表不能是完全刷新模式下动态表的下游。这是因为增量刷新模式不兼容上游完全刷新表每次刷新时发生的完整行变更。
了解对基表中的列所做的变更造成的影响¶
当与动态表关联的基础对象发生变更时,将适用以下行为:
变更 |
影响 |
---|---|
|
无。如果将新列添加到基表中或删除了未使用的列,则不会发生任何操作,并且刷新会像之前一样继续进行。 |
|
重新初始化:重新创建后的第一次刷新被称为 初始化。 |
|
动态表后续的刷新操作将会失败。必须重新创建动态表才能响应变更。 |
动态表刷新的最佳实践¶
使用专用仓库进行刷新¶
动态表需要虚拟仓库来执行刷新。为了清晰了解与动态表管道相关的成本,您应使用专用仓库测试动态表,以便可以隔离归因于动态表的虚拟仓库使用。
有关更多信息,请参阅 了解动态表的成本。
使用下游滞后¶
下游滞后指示当其他从属动态表需要刷新时,动态表应刷新。由于下游滞后易于使用且具备成本效益,因此您应该使用下游滞后作为最佳实践。如果没有下游滞后,管理复杂的动态表链时需要为每个表单独分配目标滞后并管理相关的约束条件,而不仅仅是监控最终表的数据新鲜度。
有关更多信息,请参阅 了解动态表目标滞后。