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 [ OR REPLACE ] INTERACTIVE TABLE [ IF NOT EXISTS ] <table_name>
CLUSTER BY ( <expr> [ , <expr> , ... ] )
[ TARGET_LAG = '<num> { seconds | minutes | hours | days }' ]
[ WAREHOUSE = <warehouse_name> ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
AS <query>
必填参数¶
table_name指定交互式表的标识符(即名称);对于在其中创建表的架构必须唯一。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,
"My object")。放在双引号内的标识符也区分大小写。有关更多详细信息,请参阅 标识符要求。
CLUSTER BY ( expr [ , expr , ... ] )必填。 将表中的一个或多个列或列表达式指定为群集密钥。请选择在时效性要求最高的查询的 WHERE 子句中使用的列,因为这将显著影响查询性能。
有关选择有效群集密钥的更多详细信息,请参阅 群集密钥和聚类表。
AS query必填。 指定填充交互式表的 SELECT 语句。在 CREATE INTERACTIVE TABLE 语句中,无论包含哪些其他参数,该查询都必须放在语句的最后。
该查询遵循 CREATE TABLE AS SELECT (CTAS) 模式,并定义交互式表的数据和架构。
可选参数¶
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'指定交互式表的注释。
访问控制要求¶
权限 |
对象 |
备注 |
|---|---|---|
CREATE INTERACTIVE TABLE |
架构 |
在架构中创建交互式表时需要。 |
SELECT |
表、外部表、视图 |
在 AS SELECT 子句中,对被查询的表和/或视图是必需的。 |
USAGE |
数据库、架构 |
对于包含交互式表的数据库和架构是必需的。 |
USAGE |
仓库 |
对 WAREHOUSE 参数中指定的仓库是必须的(当使用 TARGET_LAG 时)。 |
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
交互式表必须使用标准仓库(而不是交互式仓库)创建。
CLUSTER BY 子句对所有交互式表是必需的,且会显著影响查询性能。请根据最常见的 WHERE 子句模式谨慎选择群集列。
通过交互式仓库查询时,交互式表可实现最佳性能。要获得交互式表的最佳性能,请执行以下操作:
创建交互式仓库
使用 ALTER WAREHOUSE ... ADD TABLES 将交互式表关联到交互式仓库
恢复交互式仓库
使用交互式仓库查询交互式表
交互式表支持的 SQL 操作集相较于标准表更为有限:
包含 WHERE 子句的 SELECT 语句已优化。
支持简单的 GROUP BY 操作。
不支持 DML 操作(INSERT、UPDATE、DELETE)。唯一允许的 DML 操作是 INSERT OVERWRITE。
复杂查询操作可能无法显著提升性能。
动态交互式表(带有 TARGET_LAG)使用指定的标准仓库自动刷新。滞后时间平衡了数据新鲜度和计算成本。
静态交互式表需要手动刷新,才能使用源表中的新数据进行更新。
交互式表存储额外的元数据和索引信息以加速查询,但这些信息经过压缩,对存储大小的影响微乎其微。
变体语法:静态交互式表¶
创建一个静态交互式表,该表从源查询中填充一次:
CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
CLUSTER BY ( <expr> [ , <expr> , ... ] )
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
AS <query>
静态交互式表不会自动刷新,需要手动更新以反映源数据的更改。
变体语法:动态交互式表¶
创建根据指定的滞后时间自动刷新的动态交互式表:
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());