关于管理动态表

管理动态表通常涉及以下任务:

任务

描述

列出和查看有关动态表的信息

列出动态表并查看有关动态表的信息。

转移所有权

使用 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;
Copy
+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  | 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;
Copy
+-------------------+--------------------------------------------------------------------------------------------------------------------------+
  | 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 视图 的结果中。

转移所有权

要授予动态表的 OWNERSHIP 权限,请确保接收角色在以下对象上具有 USAGE 权限。否则,后续的计划刷新将失败。

  • 包含动态表的数据库和架构。

  • 用于刷新表的仓库。

要转移动态表的所有权,您可以使用 GRANT OWNERSHIP 命令或 Snowsight

以下示例使用 GRANT OWNERSHIP 命令将 my_dynamic_table 的所有权权限授予 budget_admin 角色。

GRANT OWNERSHIP ON DYNAMIC TABLE my_dynamic_table TO ROLE budget_admin;
Copy

以下示例使用 GRANT OWNERSHIP 命令将所有权权限授予 budget_admin 角色,该权限适用于在 mydb.myschema 架构中创建的所有未来动态表。

GRANT OWNERSHIP ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE budget_admin;
Copy

要了解有关 Snowflake 权限模型的更多信息,请参阅 访问控制概述访问控制权限

更改现有动态表

本节介绍如何使用 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;
Copy
-- Specify the downstream target lag for a dynamic table:
ALTER DYNAMIC TABLE my_dynamic_table SET
  TARGET_LAG = DOWNSTREAM;
Copy

重命名动态表

如果您的脚本或应用程序依赖于特定表名称,并且您希望在不更改现有脚本的情况下更新动态表,则重命名动态表可能很有用。例如,如果您有一个引用特定动态表名的脚本,通过重命名表,您可以在不更改脚本的情况下更换基础表。这确保了连续性,并避免了跨脚本或进程更新多个引用的麻烦。

要重命名动态表,请使用 ALTER DYNAMIC TABLE ... RENAME TO 命令。例如:

ALTER DYNAMIC TABLE my_dynamic_table RENAME TO my_new_dynamic_table;
Copy

交换动态表

交换动态表可以实现数据集或表版本之间的无缝过渡,而不会干扰工作流程或修改依赖的脚本。例如,如果您正在开发表的新版本,但希望保持现有名称以供正在进行的流程使用,通过交换,您可以将旧表替换为新表。这种方法确保了连续性,同时使得在最小的停机时间或干扰下进行更新、测试或升级成为可能。

要交换动态表,请使用 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;
Copy

对动态表进行聚类

对动态表进行聚类可以通过提高查询效率和刷新操作来增强性能:

  • 查询效率:与常规表一样,对动态表进行聚类分析,可以通过聚类常见的连接键或筛选列来加速查询。

  • 刷新操作:如果群集密钥与频繁的更改模式保持一致,则聚类还可以帮助加快刷新速度;例如,当有少数用户发生变更时,按用户 ID 进行聚类可能会非常有效。

群集密钥可以为动态表的增量刷新模式或完全刷新模式指定。 在完全刷新模式下,聚类操作会在刷新过程中执行,因此无需后台重聚类。

要对动态表进行聚类,请使用 ALTER DYNAMIC TABLE ...CLUSTER BY 命令:

ALTER DYNAMIC TABLE my_dynamic_table CLUSTER BY (date);
Copy

删除或取消删除动态表

本节介绍如何删除现有动态表并恢复它们。

如果动态表不再与您的数据管道相关,您可能不再需要该表。删除它有助于清理您的环境,并减少不必要的存储和计算资源使用。由于动态表会消耗资源,特别是在频繁刷新的情况下,因此删除未使用的表可以防止进一步消耗资源,从而帮助管理成本。

您可以使用 UNDROP DYNAMIC TABLE 命令取消删除(换言之,恢复)已删除的动态表。这样,您就可以恢复动态表及其数据,而无需重新创建它,无论是由于意外删除,还是以前删除的表因项目优先级或数据需求变化而再次变得相关。

要删除或取消删除动态表,您必须使用具有该动态表 OWNERSHIP 权限的角色。

删除现有动态表

要删除动态表,只要您拥有 OWNERSHIP 权限,您可以使用 DROP DYNAMIC TABLE 命令或 Snowsight

以下示例使用 DROP DYNAMIC TABLE 命令删除 my_dynamic_table

DROP DYNAMIC TABLE my_dynamic_table;
Copy

恢复已删除的动态表

要取消删除动态表,只要您拥有 OWNERSHIP 权限,您可以使用 UNDROP DYNAMIC TABLE 命令。请注意,您只能在保留期(默认为 24 小时)内取消删除动态表。如果已存在同名的动态表,则返回错误。

以下示例使用 UNDROP DYNAMIC TABLE 命令删除 my_dynamic_table

UNDROP DYNAMIC TABLE my_dynamic_table;
Copy

确定使用增量刷新还是完全刷新

要确定是使用增量刷新还是完全刷新来更新动态表,可以使用 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());
Copy

在输出中,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"                                                             |
  |                   | }                                                                               |
  +-------------------+---------------------------------------------------------------------------------+

手动暂停动态表

当您暂时不需要某个动态表时,可以手动将其暂停,以避免产生刷新成本。不必将其删除,可保留以供将来使用。暂停操作还可以帮助您更好地控制刷新频率,例如,当发生跳过操作时,您可能需要一些时间进行故障排除。

如果您希望确保在特定时间或特定事件发生时进行刷新,可以使用任务或定期运行的脚本来执行手动刷新,因为动态表无法保证精确的刷新时间。这样,您可以精确控制表的刷新。

您可以使用 ALTER DYNAMIC TABLE … SUSPEND 命令或 Snowsight 手动暂停动态表,但存在以下限制:

  • 暂停动态表也会暂停所有依赖于该表的 下游 动态表。

  • 如果在其基础表的 Time Travel 保留期之后暂停一个具有增量刷新模式的动态表,当该动态表恢复时,它将在下次刷新时失败。

ALTER DYNAMIC TABLE my_dynamic_table SUSPEND;
Copy

恢复动态表

要恢复动态表,请使用 ALTER DYNAMIC TABLE ...RESUME 命令或 Snowsight。

ALTER DYNAMIC TABLE my_dynamic_table RESUME;
Copy

手动刷新动态表

要获取最新数据,请在下次计划刷新之前手动刷新动态表。这对于大目标延迟或一次性新鲜度需求非常有用。例如,如果一个动态表配置了较大的目标延迟,且距离下一次刷新还有几个小时,手动刷新可以确保数据是最新的。

手动刷新永远不会跳过,但可能会导致跳过计划的刷新,特别是在对动态表执行频繁的手动刷新时。这样做会阻止下游动态表刷新。因此,如果某动态表具有根据目标延迟进行刷新的下游动态表,Snowflake 建议您避免频繁地对该动态表执行手动刷新。

您可以使用 ALTER DYNAMIC TABLE ...REFRESH 命令或使用 Snowsight 手动刷新动态表。

ALTER DYNAMIC TABLE my_dynamic_table REFRESH
Copy

按计划刷新动态表(计划刷新)

动态表可以通过手动刷新或根据目标延迟来安排定期刷新。每次读取动态表时,数据的新鲜度都应在目标延迟定义的时间范围内。

有关更多信息,请参阅 了解动态表目标滞后了解动态表初始化

语言: 中文