创建动态表¶
本主题概述关于创建动态表的关键概念以及在初始化过程中发生的情况。
开始之前,请确保您 有权创建动态表,并且动态表查询使用的所有对象都启用了 更改跟踪。
创建动态表时可能会有一些限制。有关完整列表,请参阅 动态表的已知限制。
启用更改跟踪¶
在创建动态表时,Snowflake 会自动尝试在所有基础对象上启用更改跟踪。 随着基础数据库对象更改,动态表也随之更改。如果重新创建对象,则必须重新启用更改跟踪。
在创建具有增量刷新的动态表时,如果尚未对其查询的表启用更改跟踪,Snowflake 会自动尝试对其启用更改跟踪。为支持增量刷新,必须对动态表使用的所有基础对象启用 非零 Time Travel 保留 的更改跟踪。
要对特定数据库对象启用更改跟踪,请在该对象上使用 ALTER TABLE、ALTER VIEW 和类似命令。创建动态表的用户必须具有 OWNERSHIP 权限,才能对所有基础对象启用更改跟踪。要检查是否启用了更改跟踪,请在基础对象上使用 SHOW VIEWS、SHOW TABLES 和类似命令,并检查 change_tracking
列。
用于创建动态表的语法¶
假设您要创建一个名称为 product
的动态表,该表包含来自名称为 staging_table
的表的 product_id
和 product_name
列,并且您决定:
您希望
product
表中的数据最多比staging_table
中的数据滞后 20 分钟。您希望将仓库
mywh
用于 刷新 所需的计算资源。您希望自动选择刷新模式。
Snowflake 建议仅在开发期间使用自动刷新模式。有关更多信息,请参阅 设置所有生产动态表的刷新模式。
您希望动态表在创建时同步刷新。
您希望自动选择刷新模式,并希望动态表在创建时同步刷新。
要创建此动态表,请执行以下 CREATE DYNAMIC TABLE SQL 语句:
CREATE OR REPLACE DYNAMIC TABLE product
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
REFRESH_MODE = auto
INITIALIZE = on_create
AS
SELECT product_id, product_name FROM staging_table;
有关参数和变体语法的完整列表,请参阅 CREATE DYNAMIC TABLE 参考。
了解动态表初始化¶
使用 CREATE DYNAMIC TABLE 语句创建动态表时,其初始刷新将在预定时间进行,或在创建时同步进行。初始数据填充或 初始化 取决于此初始刷新发生的时间。
动态表根据指定的 目标滞后 进行刷新,它设置动态表的内容滞后于基表更新的最大允许时间。如果指定动态表在创建时同步刷新,则会立即初始化。但是,如果将动态表设置为在预定时间刷新,则会在目标滞后指定的时间内初始化。
例如,假设动态表 DT1,其目标滞后为 30 分钟。DT1 的初始数据填充可能发生如下情况:
如果将 DT1 设置为在创建时同步刷新(默认),则在创建时初始化。
如果将 DT1 设置为在预定时间刷新,则在目标滞后指定的时间内初始化。
在涉及下游依赖项的情况中,动态会发生变化。假设动态表 DT1 和 D2,其中 DT1 具有 下游 目标滞后,而 DT2 具有 30 分钟的目标滞后并取决于 DT1。具有下游目标滞后的 DT1 仅在依赖动态表(例如 DT2)刷新时才刷新。
对于此上下文中的 DT1:
如果设置为在创建时同步刷新,则会在创建时刷新并初始化。如果初始化失败,表创建过程将停止,并立即提供有关任何错误定义的反馈。
如果配置为在预定时间刷新,则初始化取决于依赖表 DT2 何时进行刷新。
初始化可能需要一些时间,具体取决于扫描的数据量。要跟踪进度,您可以使用 DYNAMIC_TABLE_REFRESH_HISTORY 函数查询刷新历史记录。
了解对基表中的列所做的变更造成的影响¶
基表、视图和基础动态表中的列可能会随时间而变化。某些变更可能会影响动态表本身;其他变更可能影响有限或没有影响。
当与动态表关联的基础对象发生变更时,将适用以下行为:
变更 |
影响 |
---|---|
|
无。如果将新列添加到基表中或删除了未使用的列,则不会发生任何操作,并且刷新会像之前一样继续进行。 |
|
完全刷新/重新初始化:在下一个刷新周期中,将进行完全刷新,以确保动态表中没有不正确或过时的数据。 |
|
动态表的状态将变更为 FAILING。 必须重新创建动态表才能响应变更。有关动态表状态的更多信息,请参阅 动态表状态。 |