关于管理动态表¶
管理动态表通常涉及以下任务:
任务 |
描述 |
---|---|
列出动态表并查看有关动态表的信息。 |
|
使用 GRANT OWNERSHIP 将动态表的所有权从一个角色转移到另一个角色。 |
|
使用 ALTER DYNAMIC TABLE 命令,更改现有动态表:
|
|
使用 DROP DYNAMIC TABLE,删除动态表。 使用 UNDROP DYNAMIC TABLE,恢复已删除的动态表。 |
|
使用 Snowsight 或 ALTER DYNAMIC TABLE ...SUSPEND | RESUME 命令手动暂停或恢复动态表。 了解有关自动暂停工作原理的更多信息。 |
|
手动刷新动态表以获取最新数据。 |
|
了解计划的刷新。 |
列出和查看有关动态表的信息¶
要列出架构中的动态表并查看有关这些动态表的信息,您可以使用下面的 SQL 命令或 Snowsight,只要您使用的角色对动态表具有 MONITOR 权限。
有关更多信息,请参阅 查看动态表元数据的权限。
使用 SHOW DYNAMIC TABLES 命令可列出当前数据库中的动态表(如果当前未使用数据库,则列出账户中的动态表)。
例如,要列出数据库 mydb
和架构 myschema
中名称以 product_
开头的动态表,请执行以下 SQL 语句:
SHOW DYNAMIC TABLES LIKE 'product_%' IN SCHEMA mydb.myschema;
+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_on | name | database_name | schema_name | cluster_by | rows | bytes | owner | target_lag | refresh_mode | refresh_mode_reason | warehouse | comment | text | automatic_clustering | scheduling_state | last_suspended_on | is_clone | is_replica | is_iceberg | data_timestamp | owner_role_type |
|-------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|2025-01-01 16:32:28 +0000 | product_dt | my_db | my_schema | | 2 | 2048 | ORGADMIN | DOWNSTREAM | INCREMENTAL | null | mywh | | create or replace dynamic table | OFF | ACTIVE | null | false | false | false |2025-01-01 16:32:28 +0000 | ROLE |
| product dt ... | | |
+-------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
要输出有关动态表中列的信息,请使用 DESCRIBE DYNAMIC TABLE 命令。
例如,要列出 my_dynamic_table
中的列,请执行以下 SQL 语句:
DESC DYNAMIC TABLE my_dynamic_table;
+-------------------+--------------------------------------------------------------------------------------------------------------------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|-------------------+------------------------------------------------------------------------------------------------------------------------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y | null | N | N | null | null | null | null | null | | |
+-------------------+------------------------------------------------------------------------------------------------------------------------+
动态表也包含在 TABLES 视图 的结果中。
要列出架构中的动态表并查看有关特定动态表的信息,请执行以下操作:
登录 Snowsight。
选择 Data » Databases。
选择数据库和架构。
选择 Dynamic Tables 选项卡或展开数据库对象资源管理器中的 Dynamic Tables。
要查看有关特定动态表的信息,请在 Dynamic Tables 选项卡中或在数据库对象资源管理器中的动态表列表中选择动态表。
此页面中的选项卡可提供有关所选动态表的以下详细信息:
Table Details:显示有关动态表的基本信息,包括:
动态表的计划状态。
动态表的上次刷新状态。对于失败的刷新,如果将鼠标悬停在状态上方,则可以查看有关错误的更多信息。
动态表的当前滞后和目标滞后。
是否使用 增量刷新或完全刷新 来更新表。
动态表的定义。
动态表的标签。
为使用动态表而授予的权限。
Columns:有关动态表中列的信息。
Data Preview:动态表中最多 100 行数据的预览。
Graph:显示包含此动态表的 有向无环图 (DAG)。
Refresh History:显示刷新历史记录和滞后指标。
转移所有权¶
要授予动态表的 OWNERSHIP 权限,请确保接收角色在以下对象上具有 USAGE 权限。否则,后续的计划刷新将失败。
包含动态表的数据库和架构。
用于刷新表的仓库。
要转移动态表的所有权,您可以使用 GRANT OWNERSHIP 命令或 Snowsight。
以下示例使用 GRANT OWNERSHIP 命令将 my_dynamic_table
的所有权权限授予 budget_admin
角色。
GRANT OWNERSHIP ON DYNAMIC TABLE my_dynamic_table TO ROLE budget_admin;
以下示例使用 GRANT OWNERSHIP 命令将所有权权限授予 budget_admin
角色,该权限适用于在 mydb.myschema
架构中创建的所有未来动态表。
GRANT OWNERSHIP ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE budget_admin;
登录 Snowsight。
在导航中,转到 Monitoring » Dynamic Tables。
选择要转移所有权的角色。
更改现有动态表¶
本节介绍如何使用 ALTER DYNAMIC TABLE 命令对现有动态表进行更改。
更改动态表的仓库或目标滞后¶
您可能希望调整动态表的仓库以提高成本效率或提高性能。有关更多信息,请参阅 计算成本 和 仓库配置如何影响动态表性能。
您可能希望调整动态表的目标滞后,以获取更新的数据、降低计算成本或更好地与上游依赖关系的刷新间隔保持一致。有关更多信息,请参阅 了解动态表目标滞后。
要更改动态表的仓库或目标滞后,请使用 ALTER DYNAMIC TABLE 命令。例如:
-- Change the warehouse for my_dynamic_table to my_other_wh:
ALTER DYNAMIC TABLE my_dynamic_table SET
WAREHOUSE = my_other_wh;
-- Specify the downstream target lag for a dynamic table:
ALTER DYNAMIC TABLE my_dynamic_table SET
TARGET_LAG = DOWNSTREAM;
重命名动态表¶
如果您的脚本或应用程序依赖于特定表名称,并且您希望在不更改现有脚本的情况下更新动态表,则重命名动态表可能很有用。例如,如果您有一个引用特定动态表名的脚本,通过重命名表,您可以在不更改脚本的情况下更换基础表。这确保了连续性,并避免了跨脚本或进程更新多个引用的麻烦。
要重命名动态表,请使用 ALTER DYNAMIC TABLE ... RENAME TO 命令。例如:
ALTER DYNAMIC TABLE my_dynamic_table RENAME TO my_new_dynamic_table;
交换动态表¶
交换动态表可以实现数据集或表版本之间的无缝过渡,而不会干扰工作流程或修改依赖的脚本。例如,如果您正在开发表的新版本,但希望保持现有名称以供正在进行的流程使用,通过交换,您可以将旧表替换为新表。这种方法确保了连续性,同时使得在最小的停机时间或干扰下进行更新、测试或升级成为可能。
要交换动态表,请使用 ALTER DYNAMIC TABLE ... SWAP WITH 命令。请注意,您只能将动态表与另一个动态表交换。
例如:
-- Swap my_dynamic_table with the my_new_dynamic_table:
ALTER DYNAMIC TABLE my_dynamic_table SWAP WITH my_new_dynamic_table;
对动态表进行聚类¶
对动态表进行聚类可以通过提高查询效率和刷新操作来增强性能:
查询效率:与常规表一样,对动态表进行聚类分析,可以通过聚类常见的连接键或筛选列来加速查询。
刷新操作:如果群集密钥与频繁的更改模式保持一致,则聚类还可以帮助加快刷新速度;例如,当有少数用户发生变更时,按用户 ID 进行聚类可能会非常有效。
群集密钥可以为动态表的增量刷新模式或完全刷新模式指定。 在完全刷新模式下,聚类操作会在刷新过程中执行,因此无需后台重聚类。
要对动态表进行聚类,请使用 ALTER DYNAMIC TABLE ...CLUSTER BY 命令:
ALTER DYNAMIC TABLE my_dynamic_table CLUSTER BY (date);
删除或取消删除动态表¶
本节介绍如何删除现有动态表并恢复它们。
如果动态表不再与您的数据管道相关,您可能不再需要该表。删除它有助于清理您的环境,并减少不必要的存储和计算资源使用。由于动态表会消耗资源,特别是在频繁刷新的情况下,因此删除未使用的表可以防止进一步消耗资源,从而帮助管理成本。
您可以使用 UNDROP DYNAMIC TABLE 命令取消删除(换言之,恢复)已删除的动态表。这样,您就可以恢复动态表及其数据,而无需重新创建它,无论是由于意外删除,还是以前删除的表因项目优先级或数据需求变化而再次变得相关。
要删除或取消删除动态表,您必须使用具有该动态表 OWNERSHIP 权限的角色。
删除现有动态表¶
要删除动态表,只要您拥有 OWNERSHIP 权限,您可以使用 DROP DYNAMIC TABLE 命令或 Snowsight。
以下示例使用 DROP DYNAMIC TABLE 命令删除 my_dynamic_table
。
DROP DYNAMIC TABLE my_dynamic_table;
登录 Snowsight。
在导航中,转到 Monitoring » Dynamic Tables。
在弹出窗口中,确认要删除的动态表。
恢复已删除的动态表¶
要取消删除动态表,只要您拥有 OWNERSHIP 权限,您可以使用 UNDROP DYNAMIC TABLE 命令。请注意,您只能在保留期(默认为 24 小时)内取消删除动态表。如果已存在同名的动态表,则返回错误。
以下示例使用 UNDROP DYNAMIC TABLE 命令删除 my_dynamic_table
。
UNDROP DYNAMIC TABLE my_dynamic_table;
确定使用增量刷新还是完全刷新¶
要确定是使用增量刷新还是完全刷新来更新动态表,可以使用 Snowsight 或 SQL 命令。
- Snowsight:
转到 动态表详细信息页面。
页面顶部的基本详细信息会显示该表是使用增量刷新还是完全刷新。
- SQL:
使用 SHOW DYNAMIC TABLES 命令,并检查输出中
REFRESH_MODE
列的值。REFRESH_MODE_REASON 包含有关 REFRESH_MODE 选择的更多详细信息。
了解对基表中的列所做的变更造成的影响¶
基表、视图和基础动态表中的列可能会随时间而变化。某些变更可能会影响动态表本身;其他变更可能影响有限或没有影响。
当与动态表关联的基础对象发生变更时,将适用以下行为:
变更 |
影响 |
---|---|
|
无。如果将新列添加到基表中或删除了未使用的列,则不会发生任何操作,并且刷新会像之前一样继续进行。 |
|
完全刷新/重新初始化:在下一个刷新周期中,将进行完全刷新,以确保动态表中没有不正确或过时的数据。 |
|
动态表的状态将变更为 FAILED。必须重新创建动态表才能响应变更。 |
暂停或恢复动态表¶
本节讨论动态表自动暂停的原因以及如何手动暂停或恢复动态表。
自动动态表暂停¶
动态表将在连续 5 次计划刷新错误后自动暂停。成功刷新(包括手动刷新)会将错误计数重置为 0。例如,如果表连续两次计划刷新失败,然后在下一次刷新中成功,则错误计数将重置为 0。
手动触发的刷新产生的错误不计入此限制。
任何依赖于已暂停表的动态表也将被暂停。
您可以使用以下选项之一查看动态表的当前状态(ACTIVE 或 SUSPENDED):
执行 DYNAMIC_TABLE_GRAPH_HISTORY 表函数:
SELECT name, scheduling_state
FROM TABLE (INFORMATION_SCHEMA.DYNAMIC_TABLE_GRAPH_HISTORY());
在输出中,SCHEDULING_STATE
列显示动态表(ACTIVE 或 SUSPENDED)的状态:
+-------------------+---------------------------------------------------------------------------------+
| NAME | SCHEDULING_STATE |
|-------------------+---------------------------------------------------------------------------------|
| DTSIMPLE | { |
| | "reason_code": "SUSPENDED_DUE_TO_ERRORS", |
| | "reason_message": "The DT was suspended due to 5 consecutive refresh errors", |
| | "state": "SUSPENDED", |
| | "suspended_on": "2023-06-06 19:27:29.142 -0700" |
| | } |
| DT_TEST | { |
| | "state": "ACTIVE" |
| | } |
+-------------------+---------------------------------------------------------------------------------+
要查看动态表的状态,请登录 Snowsight。在导航菜单中,选择 Monitoring Dynamic Tables。
您可以在此页面上查看动态表的状态和上次刷新状态。您还可以按数据库或架构进行筛选以缩小结果范围。
手动暂停动态表¶
当您暂时不需要某个动态表时,可以手动将其暂停,以避免产生刷新成本。不必将其删除,可保留以供将来使用。暂停操作还可以帮助您更好地控制刷新频率,例如,当发生跳过操作时,您可能需要一些时间进行故障排除。
如果您希望确保在特定时间或特定事件发生时进行刷新,可以使用任务或定期运行的脚本来执行手动刷新,因为动态表无法保证精确的刷新时间。这样,您可以精确控制表的刷新。
您可以使用 ALTER DYNAMIC TABLE … SUSPEND 命令或 Snowsight 手动暂停动态表,但存在以下限制:
暂停动态表也会暂停所有依赖于该表的 下游 动态表。
如果在其基础表的 Time Travel 保留期之后暂停一个具有增量刷新模式的动态表,当该动态表恢复时,它将在下次刷新时失败。
ALTER DYNAMIC TABLE my_dynamic_table SUSPEND;
登录 Snowsight。
在导航中,转到 Monitoring » Dynamic Tables。
在弹出窗口中,确认要暂停的动态表。
恢复动态表¶
要恢复动态表,请使用 ALTER DYNAMIC TABLE ...RESUME 命令或 Snowsight。
ALTER DYNAMIC TABLE my_dynamic_table RESUME;
登录 Snowsight。
在导航中,转到 Monitoring » Dynamic Tables。
在弹出窗口中,确认要恢复的动态表。
手动刷新动态表¶
要获取最新数据,请在下次计划刷新之前手动刷新动态表。这对于大目标延迟或一次性新鲜度需求非常有用。例如,如果一个动态表配置了较大的目标延迟,且距离下一次刷新还有几个小时,手动刷新可以确保数据是最新的。
手动刷新永远不会跳过,但可能会导致跳过计划的刷新,特别是在对动态表执行频繁的手动刷新时。这样做会阻止下游动态表刷新。因此,如果某动态表具有根据目标延迟进行刷新的下游动态表,Snowflake 建议您避免频繁地对该动态表执行手动刷新。
您可以使用 ALTER DYNAMIC TABLE ...REFRESH 命令或使用 Snowsight 手动刷新动态表。
ALTER DYNAMIC TABLE my_dynamic_table REFRESH
登录 Snowsight。
选择 Monitoring » Dynamic Tables。
按计划刷新动态表(计划刷新)¶
动态表可以通过手动刷新或根据目标延迟来安排定期刷新。每次读取动态表时,数据的新鲜度都应在目标延迟定义的时间范围内。