创建动态表

本主题概述了创建动态表的关键概念。

开始之前,请确保您 有权创建动态表,并且动态表查询使用的所有对象都启用了 更改跟踪

创建动态表时可能会有一些限制。有关完整列表,请参阅 动态表限制

启用更改跟踪

在创建具有增量刷新模式的动态表时,如果尚未对其查询的表启用更改跟踪,Snowflake 会自动尝试对其启用更改跟踪。为支持增量刷新,必须对动态表使用的所有基础对象启用 非零 Time Travel 保留 的更改跟踪。

随着基础对象的变化,动态表也会发生变化。如果您重新创建一个基础对象,您必须重新启用更改跟踪。

备注

Snowflake 不会自动尝试在使用完全刷新模式创建的动态表上启用更改跟踪。

要对特定数据库对象启用更改跟踪,请在该对象上使用 ALTER TABLEALTER VIEW 和类似命令。创建动态表的用户必须具有 OWNERSHIP 权限,才能对所有基础对象启用更改跟踪。

要检查是否启用了更改跟踪,请在基础对象上使用 SHOW VIEWSSHOW TABLES 和类似命令,并检查 change_tracking 列。

用于创建动态表的语法

假设您要创建一个动态表,该表包含来自名称为 staging_table 的表的 product_idproduct_name 列,并且您决定:

  • 您希望动态表中的数据最多比 staging_table 中的数据滞后 20 分钟。

  • 您希望将仓库 mywh 用于 刷新 所需的计算资源。

  • 您希望自动选择刷新模式。

  • 您希望动态表在创建时同步刷新。

  • 您希望自动选择刷新模式,并希望动态表在创建时同步刷新。

要创建此动态表,请执行以下 CREATE DYNAMIC TABLE SQL 语句:

CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
  TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  REFRESH_MODE = auto
  INITIALIZE = on_create
  AS
    SELECT product_id, product_name FROM staging_table;
Copy

有关参数和变体语法的完整列表,请参阅 CREATE DYNAMIC TABLE 参考。

创建动态表的最佳实践

将动态表的管道链接在一起

定义新的动态表时,不要定义包含许多嵌套语句的大型动态表,而应使用小型动态表与管道组合的方式。

您可以设置动态表来查询其他动态表。例如,想象这样一个场景:您的数据管道从暂存表中提取数据以更新各种维度表(例如,customerproductdatetime)。此外,管道还根据这些维度表中的信息更新汇总 sales 表。通过将维度表配置为查询暂存表,将汇总 sales 表配置为查询维度表,可以创建类似于任务图的级联效果。

在此设置中,仅在维度表刷新成功完成后才能执行汇总 sales 表的刷新。这样可以确保数据的一致性并达到滞后目标。通过自动刷新过程,源表中的任何更改都会在适当的时候触发对所有从属表的刷新。

任务图和动态表 DAGs 的比较

对复杂任务图使用“控制器”动态表

如果您有一个动态表的复杂图表,其中包含许多根节点和叶节点,并且您想使用单个命令对整个任务图执行操作(例如更改滞后、手动刷新、挂起),请执行以下步骤:

  1. 将所有动态表的 TARGET_LAG 值设置为 DOWNSTREAM

  2. 创建一个“控制器”动态表,从任务图中的所有叶中读取。要确保此控制器不消耗资源,请执行以下语句:

    CREATE DYNAMIC TABLE controller
      TARGET_LAG = <target_lag>
      WAREHOUSE = <warehouse>
      AS
        SELECT 1 A FROM <leaf1>, …, <leafN> LIMIT 0;
    
    Copy
  3. 使用此控制器控制整个图表。例如:

  • 为任务图设置新的目标滞后。

    ALTER DYNAMIC TABLE controller SET
      TARGET_LAG = <new_target_lag>;
    
    Copy
  • 手动刷新任务图。

    ALTER DYNAMIC TABLE controller REFRESH;
    
    Copy

关于克隆动态表管道

在同一克隆命令中克隆动态表管道的所有元素,以避免重新初始化管道。您可以通过在同一架构或数据库中整合管道的所有元素(例如基表、视图和动态表)来做到这一点。

使用瞬态动态表降低存储成本

瞬态 动态表可随着时间的推移可靠地维护数据,并支持数据保留期内的 Time Travel,但不保留超过故障安全期的数据。默认情况下,动态表数据在 故障安全 存储中保留七天。

对于具有高刷新吞吐量的动态表,这会显著增加存储消耗。因此,只有当动态表的数据不需要与永久表提供的数据保护和恢复处于相同级别时,才应将其变为瞬态表。

您可以使用 CREATE DYNAMIC TABLE 语句创建瞬态动态表,或将现有动态表克隆到瞬态动态表。

动态表创建故障排除

创建动态表时,初始刷新要么按计划 (ON_SCHEDULE) 进行,要么在创建时立即进行 (ON_CREATE)。初始数据填充或 初始化 取决于此初始刷新发生的时间。例如,对于 ON_CREATE,如果初始化触发上游动态表刷新,则可能需要更长时间。

初始化可能需要一些时间,具体取决于扫描的数据量。要查看进度,请执行以下操作:

  1. 登录 Snowsight

  2. 在导航菜单中,选择 Monitoring » Query History

  3. Filters 下拉列表中,在 SQL Text 筛选器中输入 CREATE DYNAMIC TABLE,并在 Warehouse 筛选器中输入您的仓库名称。

  4. 选择 SQL text 下动态表的查询,并使用 Query DetailsQuery Profile 选项卡跟踪进度。

语言: 中文