概述
Dynamic Tables(动态表,DT)是声明式、可自动刷新的物化查询。用户编写 SELECT、设置 TARGET_LAG 后,Snowflake 按所选调度保持结果新鲜。该技能用于判断 DTs 是否合适、设计多层管道,并规避生产中的常见失败模式。适用于在 DTs、物化视图、Streams+Tasks 或 dbt 之间选型,或现有 DT 管道出现异常(全量刷新回退、延迟漂移、成本失控)时。
选型决策
技能给出决策流程:单表查询加速选物化视图;多步 SQL 管道且需新鲜数据选 Dynamic Tables;流-静态连接或仅追加场景选 Custom Incremental DTs(公开预览);需要跨仓库可移植性或 dbt 测试选 dbt 模型;需要过程逻辑、IF/ELSE、API 调用或亚分钟级延迟选 Streams+Tasks。经验法则是优先用 DTs,仅在需要过程逻辑、副作用或亚分钟延迟时使用 Streams+Tasks,需要测试框架或跨仓库可移植性时用 dbt。
主要能力与管道模式
技能提供对比矩阵,从刷新方式、SQL 支持、链式依赖、增量、副作用、成本等维度比较四种方案。示例采用 Bronze→Silver→Gold 分层:Bronze 解析原始 VARIANT,Silver 做业务逻辑与连接,Gold 做聚合。关键规则是只有叶子 DT 使用基于时间的 TARGET_LAG,中间层使用 DOWNSTREAM,由 Snowflake 从叶子推导延迟。示例代码中创建动态表使用 CREATE DYNAMIC TABLE ... TARGET_LAG ... WAREHOUSE ... AS SELECT 语法。
监控与运维
技能提供监控查询:通过 INFORMATION_SCHEMA.DYNAMIC_TABLES() 查看调度状态、最近刷新状态与 time_within_target_lag_ratio;通过 DYNAMIC_TABLE_REFRESH_HISTORY 查看刷新历史与错误;账户级 DT 成本可查询 ACCOUNT_USAGE.QUERY_HISTORY 并过滤刷新查询。技能还给出混合模式:在 Gold 动态表上创建 Stream,并用 Task 在数据变化时发送邮件通知。
常见错误与生产检查
常见错误包括:DT 定义中使用未规划的 SELECT *(可能触发重新初始化并传播敏感列);每一层都设时间延迟;基表未开启 CHANGE_TRACKING;悄悄回退到 FULL 刷新;缺少 PRIMARY KEY RELY 导致 INSERT OVERWRITE 重处理下游;在大规模且聚类不佳的数据上使用 DISTINCT/UNION(EXCEPT/INTERSECT/MINUS 会强制全量刷新);与交互查询共用仓库;大初始加载未设 INITIALIZATION_WAREHOUSE。生产就绪检查表涵盖显式列清单、CHANGE_TRACKING、DOWNSTREAM、刷新模式验证、专用仓库、监控与告警、初始仓库设置等。
使用方式与限制
技能按工作流执行:评估适用性、选择刷新模式(AUTO/INCREMENTAL/FULL/CUSTOM_INCREMENTAL)、设计分层、按检查表加固。技能设置多个停止点:对现有管道执行 CREATE OR REPLACE DYNAMIC TABLE 前需展示计划 DDL 并确认;执行 SUSPEND 或 DROP 前需确认,因下游 DT 会停止刷新;修改基表(SET CHANGE_TRACKING、ADD PRIMARY KEY ... RELY)或运行 snow dcm deploy 前需确认,其中 RELY 不被强制,非唯一键可能产生错误刷新结果。参考资料包括坑点与主键、Custom Incremental DTs 语法、DT 的数据库变更管理。该技能的具体授权方式、收费与价格暂未提供。