Snowflake 交互式表和交互式仓库¶
本主题介绍 Snowflake 交互式表 和 交互式仓库。它们为高并发、交互式工作负载提供低延迟查询性能。
备注
交互式表现在支持联接查询。
交互式仓库和交互式表概述¶
以下是与此功能配合使用的新型 Snowflake 对象。使用交互式仓库对交互式表进行查询时,您可以获得更好的查询性能。
- 交互式仓库
一种新型仓库,针对低延迟、交互式工作负载进行了优化。
交互式仓库专门针对低延迟、交互式工作负载调整了 Snowflake 引擎。它利用基础交互式表中的附加元数据和索引信息来加速查询。这种类型的仓库经过优化,可连续运行,为大量并发查询提供服务。所有交互式仓库都在最新一代的硬件上运行。
- 交互式表
一种新型 Snowflake 表,专门用于低延迟的交互式查询。
通过交互式仓库查询这些表,可获得最佳性能提升。交互式表与标准 Snowflake 表相比,不仅拥有不同的数据引入方法,其支持的 SQL 语句和查询运算符集也更有限。
交互式表的用例¶
当需要稳定低延迟响应时,Snowflake 交互式表进行了优化,以适用于快速、简单的查询。交互式仓库提供高效服务这些查询所需的计算资源。它们共同实现了诸如实时仪表板、数据驱动型 APIs 以及为高并发工作负载提供服务等用例。
最适合交互式表的简单查询通常是具有选择性 WHERE 子句的 SELECT 语句,可选地包括一些维度上的 GROUP BY 子句。避免涉及大型联接和大型子查询的查询。使用其他功能(如窗口函数)的查询的性能高度依赖于您正在查询的数据形状。
区域可用性¶
交互式表和交互式仓库在以下 Amazon Web Services (AWS) 区域可用。有关 Snowflake 区域的更多信息,请参阅 支持的云区域。
us-east-1– US 东部(弗吉尼亚北部)us-west-2– US 西部(俄勒冈州)us-east-2- US 东部(俄亥俄州)ap-northeast-1- 亚太地区(东京)ap-southeast-2- 亚太地区(悉尼)eu-central-1- EU(法兰克福)eu-west-1- EU(爱尔兰)
交互式仓库和交互式表的限制¶
在预览期间,以下限制适用于交互式仓库和交互式表。有些限制是由于交互式表和标准 Snowflake 表之间的架构差异造成的;这些限制是永久性的。
交互式仓库的限制¶
Snowflake 交互式仓库不支持长时间运行的查询。SELECT 命令的查询超时值默认为五秒。五秒钟后,查询将被取消。您可以减少查询超时值,但不能增加该值。其他类型的命令(例如 SHOW 和 INSERT OVERWRITE),不受五秒超时间隔的限制。
交互式仓库不适用于长时间运行的查询。如果查询持续超时,则表明该查询可能不适用于交互式仓库。否则,您需要应用一些性能调优技术,将时间缩短到五秒以下。
交互式仓库按照设计始终处于启动和运行状态。空闲时不会自动暂停。尽管您可以手动暂停交互式仓库,但在恢复仓库时,预计会出现明显的查询延迟。
您无法从交互式仓库查询标准 Snowflake 表。要在同一会话中查询标准表和交互式表,请运行 USE WAREHOUSE,根据表的类型切换到相应仓库类型。
如果交互式仓库是多群集仓库,则不会自动扩展。在多群集交互式仓库中,始终保持 MIN_CLUSTER_COUNT 和 MAX_CLUSTER_COUNT 设置为相同的值。
在交互式仓库中,您不能运行 CALL 命令来调用存储过程。
您不能使用
->>管道运算符。此运算符在后台使用存储过程。交互式仓库目前不支持复制。它们不包含在故障转移组和复制组中。
交互式表的限制¶
交互式表不支持以下功能:
数据操作语言 (DML) 命令,例如 UPDATE 和 DELETE。您可以执行的唯一 DML 是 INSERT OVERWRITE。
复制。它们不包含在故障转移组和复制组中。
查询见解目前无法收集,也不能用于交互式表上执行的查询。
您不能执行以下操作:
使用交互式表作为物化视图的源。
修改交互式表的属性,方法是使用 ALTER TABLE 子句,例如 ADD COLUMN 或 REMOVE COLUMN。您可以执行的唯一 ALTER TABLE 更改是重命名表。
将数据掩码策略与交互式表结合使用。
将联接策略与交互式表结合使用。
将聚合策略与交互式表结合使用。
将行访问策略与交互式表结合使用。
将流与交互式表结合使用。
创建以交互式表为基表的动态表。
在对交互式表进行查询时,请使用 RESAMPLE 子句。
开始使用交互式表¶
要开始使用交互式表,请完成以下步骤序列:
使用标准仓库创建交互式表。有关更多信息,请参阅 创建交互式表。
创建交互式仓库。有关更多信息,请参阅 创建交互式仓库。
恢复交互式仓库。有关更多信息,请参阅 恢复和暂停仓库。
将交互式表添加到交互式仓库。有关更多信息,请参阅 将交互式表添加到交互式仓库。
开始通过交互式仓库查询交互式表。有关更多信息,请参阅 查询交互式表。
使用交互式表和交互式仓库¶
以下过程说明如何创建和管理使用交互式表运行查询所需的所有对象。首次尝试此功能时,请按以下顺序执行这些过程。
创建交互式表¶
表创建遵循标准 CTAS (CREATE TABLE AS SELECT) 语法,并附加了 INTERACTIVE 关键字来定义表类型。
CREATE INTERACTIVE TABLE 命令还需要 CLUSTER BY 子句。在 CLUSTER BY 子句中指定一列或多列,以匹配对时间要求最高的查询中的 WHERE 子句。您在 CLUSTER BY 子句中指定的列可以显著影响对交互式表的查询性能。因此,请谨慎选择群集列。有关选择最佳群集列的更多信息,请参阅 群集密钥和聚类表。
备注
您可以使用标准仓库运行 CREATE INTERACTIVE TABLE 命令。您仅在后续步骤中使用交互式仓库来查询交互式表。
使用以下命令创建一个交互式表,其中包含与标准表相同的列和数据。CLUSTER BY 子句引用源表中名为 id 的列。
CREATE INTERACTIVE TABLE
IF NOT EXISTS orders
CLUSTER BY (id)
AS
SELECT * FROM demoSource;
为交互式表指定自动刷新¶
要使交互式表使用其他表中的数据自动刷新,请指定带有时间间隔的 TARGET_LAG 子句。当您指定 TARGET_LAG 时,还必须指定 WAREHOUSE 子句,以及 Snowflake 将用于执行刷新操作的标准仓库的名称。
通过 TARGET_LAG 子句的时间间隔,您能以秒、分钟、小时或天数为单位指定最大滞后:
TARGET_LAG = '<num> { seconds | minutes | hours | days }'
如果未指定单位,则数字表示秒。最小值为 60 秒或 1 分钟。
例如,以下 CREATE INTERACTIVE TABLE 语句定义了一个动态交互式表,该表滞后于指定源表不超过 20 分钟,并使用名为 my_standard_warehouse 的标准仓库执行刷新操作:
CREATE INTERACTIVE TABLE my_dynamic_interactive_table
CLUSTER BY (c1, c2)
TARGET_LAG = '20 minutes'
WAREHOUSE = my_standard_warehouse
AS SELECT c1, SUM(c2) FROM my_source_table GROUP BY c1;
有关选择相应滞后时间以平衡成本和数据新鲜度的更多信息,请参阅 确定动态表的最佳目标滞后。与动态表类似,交互式表也适用类似的注意事项。
创建交互式仓库¶
创建交互式表后,要实现最佳查询性能,需要使用交互式仓库。在 CREATE WAREHOUSE 或 CREATE OR REPLACE WAREHOUSE 命令中指定关键字 INTERACTIVE。
(可选)您可以指定 TABLES 子句,其中包含以逗号分隔的交互式表名称列表。使用该子句会立即将这些交互式表与交互式仓库关联起来。
以下命令创建了一个与名为 orders 的交互式表关联的交互式仓库。在这种情况下,您可以立即运行 USE WAREHOUSE 命令,并开始对交互式表运行查询:
CREATE OR REPLACE INTERACTIVE WAREHOUSE interactive_demo
TABLES (orders)
WAREHOUSE_SIZE = 'XSMALL';
以下命令创建了一个没有关联交互式表的交互式仓库。在这种情况下,您可以在之后运行 ALTER WAREHOUSE 命令,将交互式表与交互式仓库相关联:
CREATE or REPLACE INTERACTIVE WAREHOUSE interactive_demo
WAREHOUSE_SIZE = 'XSMALL';
创建交互式仓库后,仓库默认无限期保持活动状态。与传统仓库不同,交互式仓库不包含闲置一段时间后自动暂停的选项。
交互式表性能注意事项¶
以下章节介绍如何解决由于交互式表的特殊特征及其更适合的工作负载而可能遇到的性能问题。
交互式仓库的查询最佳实践¶
交互式仓库针对具有 选择性工作负载 的查询进行了优化。这意味着与其他查询类型相比,具有良好选择性的查询在性能方面有更多的改进。
期望通过交互式仓库获得更多的性能优势 |
期望通过交互式仓库获得有限的性能优势 |
|---|---|
SELECT col1, col4, AVG(col_x)
FROM my_table
GROUP BY col1, col2;
此查询具有高度选择性,因为它只需要几列。Snowflake 可以仅优化加载此查询所需的列。 |
SELECT * FROM my_table;
此查询处理所有列。尽管查询很简单,但 Snowflake 必须处理大量数据,这可能会超过缓存的大小。即使表的内容可以适应缓存,这也意味着缓存其他查询数据的空间减少,从而导致并发性降低。 |
SELECT col1, col2
FROM my_table
WHERE
col_x IN (1,4,7,8)
AND event_time >=
DATEADD(hour, -1, CURRENT_TIMESTAMP());
WHERE 子句中的条件使此查询具有高度选择性。IN 子句将结果限制为相对较少的项,时间比较进一步将数据限制在特定时间段内。 |
SELECT col1, col2
FROM my_table
WHERE
event_time >=
DATEADD(day, -365, CURRENT_TIMESTAMP());
询问一整年的数据会降低此查询的选择性。如果数据集很大,此查询可能会处理表中的所有行。 |
大型联接(如联接两个事实表)等其他复杂操作,或计算密集型表达式(如正则表达式)可能会因计算资源使用量增加而导致并发性降低。有关针对这些情况进行优化的信息,请参阅 选择交互式仓库的大小。
交互式表的数据布局最佳实践¶
交互式表遵循标准 Snowflake 性能最佳实践。特别是,交互式表受益于 聚类良好的表,该表根据您要筛选的相同列进行排序。例如,如果您的查询经常筛选 TIMESTAMP 列(如 sale_date),则可以在创建交互式表时使用该列作为群集密钥。例如,您可以按如下方式创建交互式表:
CREATE INTERACTIVE TABLE product_sales (<column definitions>) CLUSTER BY (sale_date);
这样,筛选 sale_date 的 SELECT 查询可以快速跳过所有不相关的数据并返回结果。例如,以下查询通过测试 sale_date 列对日期范围进行筛选:
SELECT... WHERE sale_date > '2025-10-24' AND ...
有关选择最佳群集密钥的更多详细信息,请参阅 群集密钥和聚类表。
使用搜索优化进行点查找¶
当您对交互式表执行点查找查询时,建议添加 搜索优化。点查找是对单列进行筛选以检索一行或多行数据的查询。WHERE some_id = some_UUID 是一个很好的例子。
选择交互式仓库的大小¶
完成所有查询和布局优化后,请考虑 扩展仓库 以满足需求。交互式仓库的大小范围从 XSMALL 到 3XLARGE,以及 多集群仓库。
建议您首先根据交互式表中 工作数据集 的大致大小来调整仓库大小。工作数据集是指经常查询的数据部分。例如,如果您的查询通常只查询过去七天的销售数据,则工作集是交互式表中与这七天相对应的部分。
这是因为交互式仓库使用 本地存储缓存。虽然整个数据集(表)的数据始终可访问,但访问非缓存数据确实会在首次读取时产生更高的读取延迟。
选择适合工作负载需求的仓库大小。试验特定的数据和工作负载,以确定交互式仓库的最佳大小。您可以创建一个交互式的多群集仓库。但是,目前最小和最大群集计数必须相等。也就是说,交互式多群集仓库不会自动扩展。
小技巧
为了获得良好的性能,不需要将查询的整个工作集放入缓存中。选择足以容纳 热门数据 的缓存大小,即频繁访问的行中的数据。
建议根据工作数据集大小从以下仓库大小开始。
工作集 |
仓库规模 |
|---|---|
少于 500 GB |
XSMALL |
500 GB 至 1 TB |
SMALL |
1 TB 至 2 TB |
MEDIUM |
2 TB 至 4 TB |
LARGE |
4 TB 至 8 TB |
XLARGE |
8 TB 至 16 TB |
2XLARGE |
大于 16 TB |
3XLARGE |
交互式表的性能故障排除¶
问题 1:我的单个查询耗时过长¶
这可能是因为您的查询需要更多的计算资源才能完成。您的查询可能有很多复杂的处理,因此需要更多 CPUs。例如,具有大量正则表达式筛选器和 CASE 子句的查询。您的查询也可能需要大量内存,例如执行大量 COUNT(DISTINCT ...) 的查询。要降低单个查询的运行时间,请考虑 更大的仓库规模。从以上建议的大小开始,然后不断增加仓库的大小,直到您对单个查询的延迟感到满意为止。
问题 2:我的查询突然需要很长时间才能运行(高尾延迟、高 P95 延迟)¶
查询时间突然增加可能是由于缓存不足造成的。每个仓库规模都有一个本地 SDD 缓存,我们将其用于缓存最近使用的数据。Snowflake 管理缓存,使其仅存储表中经常访问的部分。如果查询是选择性的,那么增加仓库规模可能会减少尾部延迟。
另请注意,新启动的仓库需要一段时间才能 预热缓存。Snowflake 会主动预热新添加的数据。对于基准测试,请在开始基准测试之前等待一段时间,以便缓存有时间预热。缓存预热速度基于仓库大小和表大小。交互式表越大,Snowflake 预热缓存所需的时间就越长。另一方面,指定的交互式仓库规模越大,预热时间越短。
问题 3:我的查询正在排队,或者我无法满足查询并发性¶
您可以通过设置 MIN_CLUSTER_COUNT 和 MAX_CLUSTER_COUNT 参数来扩展仓库规模。这样,您就可以创建多群集交互式仓库。目前,多群集交互式仓库不支持自动扩展。因此,请为最小和最大群集计数指定相同的值。由于预热仓库需要时间,因此手动扩展往往可以为用户提供更好的经济效益,同时仍能实现可预测的性能。
将交互式表添加到交互式仓库¶
要获得交互式表的最佳查询性能,应使用交互式仓库。
在使用交互式仓库查询交互式表之前,必须执行一次操作,将该交互式表添加到交互式仓库。否则,在交互式仓库中查询该表时,会出现“object not found”错误。如果您没有在 CREATE INTERACTIVE WAREHOUSE 命令中使用 TABLES 子句指定与交互式仓库关联的交互式表,则稍后可以使用 ALTER WAREHOUSE 命令进行指定。
以下命令将 orders 表与 interactive_demo 仓库相关联。您可以使用 ADD TABLES 子句指定多个表名,并用逗号分隔。
ALTER WAREHOUSE interactive_demo ADD TABLES (orders);
此操作将启动缓存预热过程。该过程可能需要大量时间。
如果交互式表已与交互式仓库关联,则该命令会成功,但不起作用。
您可以将一个交互式表与多个交互式仓库相关联。
从交互式仓库中移除交互式表¶
您可以通过运行带 DROP TABLES 子句的 ALTER WAREHOUSE 命令,从交互式仓库中分离一个或多个交互式表。
ALTER WAREHOUSE interactive_demo DROP TABLES (orders, customers);
备注
完成此操作后,交互式表仍然存在。此 ALTER WAREHOUSE 子句与执行 SQL 命令 DROP TABLE 不同。
恢复和暂停仓库¶
以下命令可恢复交互式仓库。您必须在创建仓库后执行此操作,因为该仓库是在暂停状态下创建的:
ALTER WAREHOUSE interactive_demo RESUME;
如果您手动暂停了仓库,您还可以执行此操作,以通过该仓库开始运行查询。
恢复后,在预热缓存期间,查询速度会很慢。可能需要几分钟到一个小时左右,具体取决于该表中的数据量。
以下命令可暂停交互式仓库:
ALTER WAREHOUSE interactive_demo SUSPEND;
您可以在开发和测试环境中暂停仓库,因为在这些环境中仓库将有很长时间不会使用。在生产环境中,通常将交互式仓库用于全天候运行许多并发查询的工作负载,或者低延迟对查询至关重要的工作负载。因此,您通常不会暂停在生产环境中使用的交互式仓库。Snowflake 不会自动暂停交互式仓库。
删除交互式仓库¶
您可以运行 DROP WAREHOUSE 命令来完全移除交互式仓库。删除交互式仓库会移除该仓库与任何交互式表之间的关联。但是,您仍然可以使用其他交互式仓库来查询这些相同的交互式表。
查询交互式表¶
在查询会话中,确保当前会话的仓库是交互式仓库:
USE WAREHOUSE interactive_demo;
此后,您可以正常查询交互式表。
备注
在交互式仓库中,您只能查询交互式表。要查询其他类型的 Snowflake 表(例如标准表或混合表),请先切换到标准仓库。
某些类型的查询特别适合交互式表。有关更多信息,请参阅 交互式表的用例。
成本和计费注意事项¶
交互式仓库在活动时会产生计算费用。目前,交互式仓库的最低计费周期为 1 分钟。从 2025 年晚些时候开始,交互式仓库的最低计费周期将调整为 1 小时,之后按 1 秒精度计费。
备注
如果您恢复已暂停的交互式仓库,该操作将产生新的最低计费周期费用。即便您因仓库中其他近期活动已在该周期内产生费用,该费用仍然会被收取。因此,建议避免在短时间内多次暂停和恢复交互式仓库,例如为了调整多集群交互式仓库中的集群数量。
交互式表会产生标准存储成本。交互式表的存储价格与标准表相同。由于数据编码和附加索引的差异,交互式表可能大于等效的标准表。较大的数据大小和索引会计入存储卷。
有关交互式仓库和交互式表的成本和计费的更多信息,请参阅 Snowflake 服务使用量表。
受影响的 SQL 语句¶
此功能对以下 Snowflake SQL 命令进行了更改:
ALTER WAREHOUSE:新增 ADD TABLES 和 DROP TABLES 子句。
CREATE INTERACTIVE TABLE:使用所需的 CLUSTER BY 子句创建交互式表。
CREATE INTERACTIVE WAREHOUSE:使用可选的 TABLES 子句创建交互式仓库。