动态表与流、任务和物化视图的比较

与流和任务一样,动态表提供一种在管道中转换数据的方法。

动态表与流和任务的比较

尽管与流和任务相比,动态表具有相似的用途,但有重要的区别。

在动态表上创建流

可以在动态表上创建流,就像在传统表上创建流一样,但有以下限制:

  • 刷新模式:只能在 增量 刷新的动态表上创建流。

  • 流类型:动态表仅支持标准(即增量)流。有关更多信息,请参阅 流的类型

以下示例展示了如何在动态表上创建流:

-- Create the dynamic table, for reference only
CREATE OR REPLACE DYNAMIC TABLE product ...;

-- Create the stream.
CREATE OR REPLACE STREAM deltaStream ON DYNAMIC TABLE product;
Copy

流和任务与动态表之间的比较

流和任务

动态表

任务使用命令式方法:您需要编写程序代码来转换基表中的数据。

动态表使用声明式方法:您可以编写一个查询,指定您想要的结果,然后从查询中使用的基表中检索和转换数据。

您可以定义执行数据转换代码的时间表。

自动刷新过程决定了执行刷新的时间表。该过程会安排执行刷新来达到指定的目标新鲜度(延迟)。

过程代码可以包含对非确定性代码的调用、存储过程和其他任务的调用。程序代码可以包含对 UDFs 和外部函数的调用。

虽然动态表的 SELECT 语句可以包含连接、聚合、窗口函数以及其他 SQL 函数和结构,但该语句不能包含对存储过程和任务的调用。当前, SELECT 语句也不能包含对外部函数的调用。

这种限制是由于动态表的刷新方式造成的。为了刷新数据,自动化过程会分析动态表的 SELECT 语句,以确定刷新数据的最佳方法。对于某些类型的查询,自动化过程无法确定这一点。

有关 SELECT 语句限制的完整列表,请参阅 增量刷新中支持的查询一般限制

任务可以使用流以增量方式刷新目标表中的数据。您可以安排这些任务定期运行。

自动刷新过程会定期对动态表进行增量刷新。该过程根据您指定的数据目标“新鲜度”来确定时间表。

示例:对比流和任务与动态表之间的数据转换

按计划转换加载的 JSON 数据 中的示例使用流和任务将新数据转换并插入到两个目标表(namevisits)中,因为数据流式传输到登陆表 (raw) 中。

以下示例说明如何使用动态表执行相同的转换。创建动态表时,您可以为要查看的结果指定查询。对于数据的增量刷新,您无需创建流来跟踪更改,也无需编写任务来检查这些更改并将更改应用于目标表。自动刷新过程会根据您指定的查询为您执行此操作。

Streams 和 Tasks 的 SQL 语句

动态表的 SQL 语句

-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a stream to capture inserts
-- to the landing table.
CREATE OR REPLACE STREAM rawstream1
  ON TABLE raw;

-- Create a table that stores the
-- names of office visitors from the
-- raw data.
CREATE OR REPLACE TABLE names
  (id INT,
   first_name STRING,
   last_name STRING);

-- Create a task that inserts new name
-- records from the rawstream1 stream
-- into the names table.
-- Execute the task every minute when
-- the stream contains records.
CREATE OR REPLACE TASK raw_to_names
  WAREHOUSE = mywh
  SCHEDULE = '1 minute'
  WHEN
    SYSTEM$STREAM_HAS_DATA('rawstream1')
  AS
    MERGE INTO names n
      USING (
        SELECT var:id id, var:fname fname,
        var:lname lname FROM rawstream1
      ) r1 ON n.id = TO_NUMBER(r1.id)
      WHEN MATCHED AND metadata$action = 'DELETE' THEN
        DELETE
      WHEN MATCHED AND metadata$action = 'INSERT' THEN
        UPDATE SET n.first_name = r1.fname, n.last_name = r1.lname
      WHEN NOT MATCHED AND metadata$action = 'INSERT' THEN
        INSERT (id, first_name, last_name)
          VALUES (r1.id, r1.fname, r1.lname);
Copy
-- Create a landing table to store
-- raw JSON data.
CREATE OR REPLACE TABLE raw
  (var VARIANT);

-- Create a dynamic table containing the
-- names of office visitors from
-- the raw data.
-- Try to keep the data up to date within
-- 1 minute of real time.
CREATE OR REPLACE DYNAMIC TABLE names
  TARGET_LAG = '1 minute'
  WAREHOUSE = mywh
  AS
    SELECT var:id::int id, var:fname::string first_name,
    var:lname::string last_name FROM raw;
Copy

动态表与物化视图的比较

动态表与物化视图有一些相似之处,它们都将查询结果 物化。不过,二者也有重要区别:

物化视图

动态表

物化视图旨在透明地提高查询性能。

例如,如果您查询基表,Snowflake 中的查询优化器会 自动:emph: 重写查询,改为查询物化视图。

动态表旨在构建多级数据管道。

虽然动态表可以提高查询性能,但 Snowflake 中的查询优化器 不会自动 重写查询以使用动态表。只有在查询中指定了动态表,查询才会使用动态表。

物化视图只能使用单个基表。物化视图不能基于复杂查询(即带有连接或嵌套视图的查询)。

动态表可以基于复杂的查询,包括包含连接和联合的查询。

通过物化视图访问的数据 始终是最新的。如果 DML 操作更改了基表中的数据,Snowflake 会更新物化视图或使用基表中的更新数据。

在动态表的目标延迟时间内,数据都是最新的。

物化视图维护由单独的计算服务自动管理,包括刷新逻辑以及任何更新的计算,通常需要额外费用。

语言: 中文