CREATE MATERIALIZED VIEW¶
基于对现有表的查询,在当前/指定的架构中创建新的物化视图,并在视图中填充数据。
有关更多详细信息,请参阅 使用物化视图。
- 另请参阅:
ALTER MATERIALIZED VIEW、DROP MATERIALIZED VIEW、SHOW MATERIALIZED VIEWS、DESCRIBE MATERIALIZED VIEW
语法¶
CREATE [ OR REPLACE ] [ SECURE ] MATERIALIZED VIEW [ IF NOT EXISTS ] <name>
[ COPY GRANTS ]
( <column_list> )
[ <col1> [ WITH ] MASKING POLICY <policy_name> [ USING ( <col1> , <cond_col1> , ... ) ]
[ WITH ] PROJECTION POLICY <policy_name>
[ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ , <col2> [ ... ] ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] AGGREGATION POLICY <policy_name> ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ CLUSTER BY ( <expr1> [, <expr2> ... ] ) ]
AS <select_statement>
必填参数¶
name
指定视图的标识符;对于在其中创建视图的架构来说,此标识符必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,
"My object"
)。放在双引号内的标识符也区分大小写。有关更多详细信息,请参阅 标识符要求。
select_statement
指定用于创建视图的查询。此查询用作视图的文本/定义。此查询在 SHOW VIEWS 和 SHOW MATERIALIZED VIEWS 的输出中显示。
select_statement
有一些限制。有关详细信息,请参阅:
可选参数¶
column_list
:如果不希望视图中的列名与基础表的列名相同,则可以添加一个列的列表,在该列表中指定列名。(无需指定列的数据类型。)
如果添加物化视图的 CLUSTER BY 子句,则必须添加列名列表。
MASKING POLICY = policy_name
指定要在列上设置的 掩码策略。
USING ( col_name , cond_col_1 ... )
指定要传递到条件掩码策略 SQL 表达式的实参。
列表中的第一列指定用于掩码处理或标记数据的策略条件的列,并且 必须 与设置掩码策略的列匹配。
附加列指定要评估的列,以确定在对第一列进行查询时是否对查询结果的每行中的数据进行掩码处理或标记化。
如果省略 USING 子句,Snowflake 会将条件掩码策略视为正常的 掩码策略。
PROJECTION POLICY policy_name
指定要在列上设置的 投影策略。
string_literal
指定视图的注释。字符串字面量应放在单引号内。(字符串字面量不应包含单引号,除非它们被转义。)
默认:无值。
expr#
指定要对物化视图进行聚类的表达式。通常,每个表达式都是物化视图中列的名称。
SECURE
指定视图为安全视图。有关安全视图的详细信息,请参阅 使用安全视图。
默认:无值(视图不是安全视图)
COPY GRANTS
如果要使用
OR REPLACE
子句替换现有视图,则替换视图将保留原始视图的访问权限。此参数将现有视图中的所有权限( OWNERSHIP 除外 )复制到新视图中。新视图 不会 继承为架构中的对象类型定义的任何未来授权。默认情况下,执行 CREATE MATERIALIZED VIEW 语句的角色拥有新视图。如果该参数未包含在 CREATE VIEW 语句中,则新视图 不会 继承对原始视图授予的任何显式访问权限,但会继承为架构中的对象类型定义的任何未来授权。
请注意,复制授权的操作在 CREATE VIEW 语句中(即在同一事务中)自动发生。
默认:无值(未复制授权)。
ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )
指定要对物化视图设置的 行访问策略。
AGGREGATION POLICY policy_name
指定要对物化视图设置的 聚合策略。
使用说明¶
创建物化视图需要具有对架构的 CREATE MATERIALIZED VIEW 权限,并且具有对基表的 SELECT 权限。有关权限和物化视图的更多信息,请参阅 对物化视图的架构的权限。
如果在视图定义中指定 CURRENT_DATABASE 或 CURRENT_SCHEMA 函数,该函数会返回包含视图的数据库或架构,而不是用于会话的数据库或架构。
为物化视图选择名称时,请注意,架构中不能包含同名的表和视图。如果架构中已存在同名表,CREATE [ MATERIALIZED ] VIEW 会产生错误。
指定
select_statement
时,请注意以下事项:不能指定 HAVING 子句或 ORDER BY 子句。
如果为物化视图添加 CLUSTER BY 子句,则必须添加
column_list
子句。如果在
select_statement
中多次引用基表,则对基表的所有引用使用相同的 限定符。例如,不要在同一
select_statement
中混合使用base_table
、schema.base_table
和database.schema.base_table
。相反,选择其中一种形式(例如database.schema.base_table
),并在整个select_statement
中始终使用此形式。不要在 SELECT 语句中查询流对象。流并非旨在充当视图或物化视图的源对象。
物化视图中不允许使用某些列名称。如果某个列名称不允许使用,则可以为列定义别名。有关详细信息,请参阅 处理物化视图中不允许的列名称。
如果物化视图查询外部表,则必须刷新外部表的文件级元数据,以反映引用的云存储位置中的更改,包括新文件、更新的文件和移除的文件。
您可以使用云存储服务的事件通知服务 自动 刷新外部表的元数据,也可以使用 ALTER EXTERNAL TABLE ...REFRESH 语句手动刷新。
物化视图还有一些其他限制。有关详细信息,请参阅 关于创建物化视图的限制 和 物化视图的使用限制。
如果基础源表的架构发生更改,导致视图定义无效,则不会更新视图定义。例如:
从基表创建视图,然后从该基表中删除列。
删除物化视图的基表。
在这些情况下,查询视图将返回一个错误,其中包括视图失效的原因。例如:
Failure during expansion of view 'MV1': SQL compilation error: Materialized View MV1 is invalid. Invalidation reason: DDL Statement was executed on the base table 'MY_INVENTORY'. Marked Materialized View as invalid.
发生这种情况时,您可以执行以下操作:
如果基表已删除,并且处于 Time Travel 的数据保留期 以使物化视图再次有效。
使用 CREATE OR REPLACE MATERIALIZED VIEW 命令重新创建视图。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
使用
OR REPLACE
相当于在现有物化视图上使用 DROP MATERIALIZED VIEW,然后创建具有相同名称的新视图。CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。
这意味着与 CREATE OR REPLACE MATERIALIZED VIEW 操作并发的任何查询都使用旧的或新的物化视图版本。
在创建一个物化视图并对一个或多个物化视图列应用了掩码策略时,或将行访问策略添加到物化视图时,请使用 POLICY_CONTEXT 函数模拟对受掩码策略保护的列和受行访问策略保护的物化视图的查询。
示例¶
在当前架构中创建一个带注释的物化视图,从表中选择所有行:
CREATE MATERIALIZED VIEW mymv COMMENT='Test view' AS SELECT col1, col2 FROM mytable;
有关更多示例,请参阅 使用物化视图 中的示例。