动态表与流、任务和物化视图的比较¶
与流和任务一样,动态表提供一种在管道中转换数据的方法。
动态表与流和任务的比较¶
尽管与流和任务相比,动态表具有相似的用途,但有重要的区别。
在动态表上创建流¶
可以在动态表上创建流,就像在传统表上创建流一样,但有以下限制:
以下示例展示了如何在动态表上创建流:
-- 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;
流和任务与动态表之间的比较¶
流和任务 |
动态表 |
---|---|
任务使用命令式方法:您需要编写程序代码来转换基表中的数据。 |
动态表使用声明式方法:您可以编写一个查询,指定您想要的结果,然后从查询中使用的基表中检索和转换数据。 |
您可以定义执行数据转换代码的时间表。 |
自动刷新过程决定了执行刷新的时间表。该过程会安排执行刷新来达到指定的目标新鲜度(延迟)。 |
过程代码可以包含对非确定性代码的调用、存储过程和其他任务的调用。程序代码可以包含对 UDFs 和外部函数的调用。 |
虽然动态表的 SELECT 语句可以包含连接、聚合、窗口函数以及其他 SQL 函数和结构,但该语句不能包含对存储过程和任务的调用。当前, SELECT 语句也不能包含对外部函数的调用。 这种限制是由于动态表的刷新方式造成的。为了刷新数据,自动化过程会分析动态表的 SELECT 语句,以确定刷新数据的最佳方法。对于某些类型的查询,自动化过程无法确定这一点。 有关 SELECT 语句限制的完整列表,请参阅 增量刷新中支持的查询 和 一般限制。 |
任务可以使用流以增量方式刷新目标表中的数据。您可以安排这些任务定期运行。 |
自动刷新过程会定期对动态表进行增量刷新。该过程根据您指定的数据目标“新鲜度”来确定时间表。 |
示例:对比流和任务与动态表之间的数据转换¶
按计划转换加载的 JSON 数据 中的示例使用流和任务将新数据转换并插入到两个目标表(name
和 visits
)中,因为数据流式传输到登陆表 (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);
|
-- 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;
|
动态表与物化视图的比较¶
动态表与物化视图有一些相似之处,它们都将查询结果 物化。不过,二者也有重要区别:
物化视图 |
动态表 |
---|---|
物化视图旨在透明地提高查询性能。 例如,如果您查询基表,Snowflake 中的查询优化器会 自动:emph: 重写查询,改为查询物化视图。 |
动态表旨在构建多级数据管道。 虽然动态表可以提高查询性能,但 Snowflake 中的查询优化器 不会自动 重写查询以使用动态表。只有在查询中指定了动态表,查询才会使用动态表。 |
物化视图只能使用单个基表。物化视图不能基于复杂查询(即带有连接或嵌套视图的查询)。 |
动态表可以基于复杂的查询,包括包含连接和联合的查询。 |
通过物化视图访问的数据 始终是最新的。如果 DML 操作更改了基表中的数据,Snowflake 会更新物化视图或使用基表中的更新数据。 |
在动态表的目标延迟时间内,数据都是最新的。 物化视图维护由单独的计算服务自动管理,包括刷新逻辑以及任何更新的计算,通常需要额外费用。 |