CREATE INTERACTIVE TABLE

在当前/指定架构中创建新的 交互式表 或替换现有表。交互式表针对低延迟的交互式查询进行了优化,并在使用交互式仓库查询时可提供最佳性能。

交互式表支持的 SQL 操作集比标准表更为有限,其专为高并发、实时查询工作负载(如仪表板和数据驱动型 APIs)而设计。

备注

创建交互式表时,必须在一个或多个列上定义 CLUSTER BY 子句,这些列用于时效性要求最高的查询的 WHERE 子句。

您还可以使用以下 CREATE INTERACTIVE TABLE 变体:

  • :ref:`label-create_interactive_table_static`(创建从查询中填充数据的静态交互式表)

  • :ref:`label-create_interactive_table_dynamic`(创建具有自动刷新功能的动态交互式表)

对于用于标准 Snowflake 表的完整 CREATE TABLE 语法,请参阅 CREATE TABLE。

小技巧

在创建和使用交互式表之前,您应该熟悉 限制和用例。交互式表最适合包含选择性 WHERE 子句的简单 SELECT 语句。

另请参阅:

CREATE WAREHOUSE、ALTER WAREHOUSE、SHOW TABLES、SHOW WAREHOUSES、DROP TABLE

语法

CREATE [ OR REPLACE ] INTERACTIVE TABLE [ IF NOT EXISTS ] <table_name>
  (
    <col_name> <col_type>
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ , <col_name> <col_type> [ ... ] ]
  )
  CLUSTER BY ( <expr> [ , <expr> , ... ] )
  [ TARGET_LAG = '<num> { seconds | minutes | hours | days }' ]
  [ WAREHOUSE = <warehouse_name> ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
  [ [ WITH ] JOIN POLICY <policy_name> [ ALLOWED JOIN KEYS ( <col_name> [ , ... ] ) ] ]
  [ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  AS <query>

必填参数

table_name

指定交互式表的标识符(即名称);对于在其中创建表的架构必须唯一。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。

有关更多详细信息,请参阅 标识符要求。

CLUSTER BY ( expr [ , expr , ... ] )

将表中的一个或多个列或列表达式指定为群集密钥。请选择在时效性要求最高的查询的 WHERE 子句中使用的列,因为这将显著影响查询性能。

有关选择有效群集密钥的更多详细信息,请参阅 群集密钥和聚类表。

AS query

指定填充交互式表的 SELECT 语句。在 CREATE INTERACTIVE TABLE 语句中,无论包含哪些其他参数,该查询都必须放在语句的最后。

该查询遵循 CREATE TABLE AS SELECT (CTAS) 模式,并定义交互式表的数据和架构。

col_name

指定列标识符(即名称)。列标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内。

有关更多详细信息,请参阅 标识符要求。

col_type

指定列的数据类型。

有关可为表列指定的数据类型的详细信息,请参阅 SQL 数据类型参考。

可选参数

MASKING POLICY policy_name

指定要在列上设置的 掩码策略。

USING ( col_name , cond_col_1 ... )

指定要传递到条件掩码策略 SQL 表达式的实参。

列表中的第一列指定用于掩码处理或标记数据的策略条件的列,并且 必须 与设置掩码策略的列匹配。

附加列指定要评估的列,以确定在对第一列进行查询时是否对查询结果的每行中的数据进行掩码处理或标记化。

如果省略 USING 子句,Snowflake 会将条件掩码策略视为正常的 掩码策略。

OR REPLACE

指定替换交互式表(如果该表在架构中已存在)。这相当于对现有表使用 DROP TABLE,然后创建同名新表。

IF NOT EXISTS

指定仅当架构中尚未存在交互式表时才创建该表。如果已存在同名表,则语句将成功,而不会创建新表。

备注

OR REPLACE 和 IF NOT EXISTS 子句是互斥的,它们不能在同一语句中使用。

TARGET_LAG = 'num { seconds | minutes | hours | days }'

指定交互式表自动刷新的最大滞后时间。指定后,交互式表将成为动态交互式表,该表会自动刷新以保持在源数据的指定滞后时间内。

  • 最小值为 60 秒(1 分钟)。

  • 如果未指定单位,则数字表示秒。

  • 如果 TARGET_LAG 未指定,则表将创建为静态交互式表。

指定 TARGET_LAG 时,还需要 WAREHOUSE 参数。

WAREHOUSE = warehouse_name

**当指定 TARGET_LAG 时需要此参数。**用于在设置 TARGET_LAG 时指定刷新操作所使用的标准仓库。该仓库必须是标准仓库,而非交互式仓库。

COPY GRANTS

指定在使用 CREATE OR REPLACE INTERACTIVE TABLE 替换交互式表时保留原始表的访问权限。

该参数将除 OWNERSHIP 之外的所有权限从现有表复制到新表。默认情况下,执行 CREATE INTERACTIVE TABLE 语句的角色拥有新表。

COMMENT = 'string_literal'

指定交互式表的注释。

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

Specifies the tag name and the tag string value.

The tag value is always a string, and the maximum number of characters for the tag value is 256.

For information about specifying tags in a statement, see Tag quotas.

ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )

指定要在表上设置的 行访问策略。

CREATE OR ALTER 变体语法不支持此参数。

AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]

指定要在表上设置的 聚合策略。可以在表上应用一个或多个聚合策略。

使用可选的 ENTITY KEY 参数来定义表中哪些列可以唯一地标识实体。有关详细信息,请参阅 通过聚合策略实施实体级隐私。可以为聚合策略指定一个或多个实体键。

JOIN POLICY policy_name [ ALLOWED JOIN KEYS ( col_name [ , ... ] ) ]

指定要在表上设置的 联接策略。

使用可选的 ALLOWED JOIN KEYS 参数,定义当此策略生效时允许将哪些列用作联接列。有关更多信息,请参阅 联接策略。

CREATE OR ALTER 变体语法不支持此参数。

STORAGE LIFECYCLE POLICY policy_name ON ( col_name [ , col_name ... ] )

指定要附加到表的 存储生命周期策略。

在 ON 子句中指定的列必须与策略函数签名中定义的实参计数和数据类型相匹配。Snowflake 使用这些列来评估策略表达式,并确定哪些行需要存档或过期。

重要

如果您将归档存储策略附加到表,则该表在其生命周期内将永久分配给指定的归档层。您无法通过应用新策略来更改归档层。例如,您不能先在 ALTER TABLE...DROP STORAGE LIFECYCLE POLICY 中指定一个使用 COOL 归档层创建的策略,随后又修改表以添加一个使用 COLD 归档层创建的策略。若要更改表的归档层,请联系 Snowflake 支持部门,请求删除当前已归档的数据。有关其他注意事项,请参阅 归档存储策略。

有关创建和管理存储生命周期策略的更多信息,请参阅 创建和管理存储生命周期策略。

CREATE OR ALTER 变体语法不支持此参数。

访问控制要求

用于执行此操作的 角色 必须至少具有以下 权限:

权限

对象

备注

CREATE INTERACTIVE TABLE

架构

在架构中创建交互式表时需要。

SELECT

表、外部表、视图

在 AS SELECT 子句中,对被查询的表和/或视图是必需的。

APPLY

掩码策略、行访问策略、标签、存储生命周期策略

仅在创建表时应用掩码策略、行访问策略、对象标签、存储生命周期策略或这些 :doc:` 治理 </guides-overview-govern>` 功能的任何组合时才需要。

USAGE

数据库、架构

对于包含交互式表的数据库和架构是必需的。

USAGE

仓库

对 WAREHOUSE 参数中指定的仓库是必须的(当使用 TARGET_LAG 时)。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述。

使用说明

  • The OR REPLACE and IF NOT EXISTS clauses are mutually exclusive. They can't both be used in the same statement.

  • CREATE OR REPLACE <object> statements are atomic. That is, when an object is replaced, the old object is deleted and the new object is created in a single transaction.

  • 交互式表必须使用标准仓库(而不是交互式仓库)创建。

  • CLUSTER BY 子句对所有交互式表是必需的,且会显著影响查询性能。请根据最常见的 WHERE 子句模式谨慎选择群集列。

  • 通过交互式仓库查询时,交互式表可实现最佳性能。要获得交互式表的最佳性能,请执行以下操作:

    1. 创建交互式仓库

    2. 使用 ALTER WAREHOUSE ... ADD TABLES 将交互式表关联到交互式仓库

    3. 恢复交互式仓库

    4. 使用交互式仓库查询交互式表

  • 交互式表支持的 SQL 操作集相较于标准表更为有限:

    • 包含 WHERE 子句的 SELECT 语句已优化。

    • 支持简单的 GROUP BY 操作。

    • 不支持 DML 操作(INSERT、UPDATE、DELETE)。唯一允许的 DML 操作是 INSERT OVERWRITE。

    • 复杂查询操作可能无法显著提升性能。

  • 动态交互式表(带有 TARGET_LAG)使用指定的标准仓库自动刷新。滞后时间平衡了数据新鲜度和计算成本。

  • 静态交互式表不会自动刷新。它们需要手动更新以反映源数据的变更。为此,请对交互式表运行 CREATE OR REPLACE 命令或 INSERT OVERWRITE 命令。

  • 可以使用条件列的单个掩码策略应用于多个表,前提是表的列结构与策略中指定的列匹配。

  • 在一个或多个表列上使用掩码策略创建表或将行访问策略添加到表时,请使用 POLICY_CONTEXT 函数模拟对受掩码策略保护的列和受行访问策略保护的表的查询。

  • 交互式表存储额外的元数据和索引信息以加速查询,但这些信息经过压缩,对存储大小的影响微乎其微。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。

  • 对于使用 WITH STORAGE LIFECYCLE POLICY 子句创建表的情况:

    • 您必须具有应用该策略所需的权限。有关所需权限的信息,请参阅 Storage lifecycle policy privileges。

    • 一个表只能附加一个存储生命周期策略。

    • 列数必须与策略函数签名中的实参数匹配,并且列数据必须与实参类型兼容。

    • 如果重命名表列,则关联的策略不受影响。Snowflake 使用列 IDs 将策略与表关联。

    • 为了评估和应用存储生命周期策略表达式,Snowflake 会在内部暂时绕过表上的任何治理策略。

变体语法:静态交互式表

创建一个静态交互式表,该表从源查询中填充一次:

CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
  CLUSTER BY ( <expr> [ , <expr> , ... ] )
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  AS <query>

静态交互式表不会自动刷新。它们需要手动更新以反映源数据的变更。为此,请对交互式表运行 CREATE OR REPLACE 命令或 INSERT OVERWRITE 命令。

变体语法:动态交互式表

创建根据指定的滞后时间自动刷新的动态交互式表:

CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
  CLUSTER BY ( <expr> [ , <expr> , ... ] )
  TARGET_LAG = '<num> { seconds | minutes | hours | days }'
  WAREHOUSE = <warehouse_name>
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  AS <query>

动态交互式表格会自动刷新,以保持与源数据指定的 TARGET_LAG 同步,并使用指定的标准仓库执行刷新操作。

示例

以下示例展示了创建交互式表的不同方法,并指定了其数据源以及如何刷新数据。

基本静态交互式表

根据现有订单数据创建静态交互式表,按客户和日期聚类,以实现最佳查询性能:

CREATE INTERACTIVE TABLE orders_interactive
  CLUSTER BY (customer_id, order_date)
  COMMENT = 'Interactive table for real-time order analytics'
AS
  SELECT customer_id, order_date, product_id, quantity, total_amount
  FROM orders_staging
  WHERE order_date >= '2024-01-01';

具有自动刷新功能的动态交互式表

创建每 5 分钟刷新一次的动态交互式表,以提供近乎实时的销售摘要:

CREATE INTERACTIVE TABLE sales_summary_interactive
  CLUSTER BY (region, product_category)
  TARGET_LAG = '5 minutes'
  WAREHOUSE = refresh_warehouse
  COMMENT = 'Real-time sales dashboard data'
AS
  SELECT
    region,
    product_category,
    SUM(sales_amount) as total_sales,
    COUNT(*) as transaction_count,
    AVG(sales_amount) as avg_sale
  FROM sales_data
  GROUP BY region, product_category;

用于复杂查询的多列聚类

使用针对各种查询模式进行了优化的多列聚类创建交互式表:

CREATE INTERACTIVE TABLE customer_analytics_interactive
  CLUSTER BY (customer_tier, region, signup_date)
  TARGET_LAG = '10 minutes'
  WAREHOUSE = analytics_warehouse
AS
  SELECT
    customer_id,
    customer_tier,
    region,
    signup_date,
    total_orders,
    lifetime_value,
    last_order_date
  FROM customer_metrics
  WHERE customer_tier IN ('GOLD', 'PLATINUM', 'DIAMOND');

替换现有的交互式表

使用更新的聚类和刷新设置替换现有的交互式表:

CREATE OR REPLACE INTERACTIVE TABLE product_performance_interactive
  CLUSTER BY (category, brand, launch_date)
  TARGET_LAG = '2 minutes'
  WAREHOUSE = fast_refresh_warehouse
  COPY GRANTS
AS
  SELECT
    product_id,
    category,
    brand,
    launch_date,
    units_sold,
    revenue,
    customer_rating
  FROM product_sales_view
  WHERE launch_date >= DATEADD('month', -6, CURRENT_DATE());