Snowflake 交互式表和交互式仓库¶
本主题介绍 Snowflake 交互式表 和 交互式仓库。它们为高并发、交互式工作负载提供低延迟查询性能。
备注
交互式表现在支持联接查询。
交互式仓库和交互式表概述¶
The following are the new kinds of Snowflake objects that you use with this feature. When you run queries on interactive tables using interactive warehouses, query performance is generally better than it would be with standard Snowflake tables.
- 交互式仓库
A specialized type of warehouse that's optimized for low-latency, interactive workloads.
交互式仓库专门针对低延迟、交互式工作负载调整了 Snowflake 引擎。它利用基础交互式表中的附加元数据和索引信息来加速查询。这种类型的仓库经过优化,可连续运行,为大量并发查询提供服务。所有交互式仓库都在最新一代的硬件上运行。
- 交互式表
A specialized type of Snowflake table that's optimized for low-latency, interactive queries.
通过交互式仓库查询这些表,可获得最佳性能提升。交互式表与标准 Snowflake 表相比,不仅拥有不同的数据引入方法,其支持的 SQL 语句和查询运算符集也更有限。
交互式表的用例¶
当需要稳定低延迟响应时,Snowflake 交互式表进行了优化,以适用于快速、简单的查询。交互式仓库提供高效服务这些查询所需的计算资源。它们共同实现了诸如实时仪表板、数据驱动型 APIs 以及为高并发工作负载提供服务等用例。
最适合交互式表的简单查询通常是具有选择性 WHERE 子句的 SELECT 语句,可选地包括一些维度上的 GROUP BY 子句。避免涉及大型联接和大型子查询的查询。使用其他功能(如窗口函数)的查询的性能高度依赖于您正在查询的数据形状。
区域可用性¶
交互式表和交互式仓库在以下 Amazon Web Services (AWS) 区域可用。有关 Snowflake 区域的更多信息,请参阅 Supported cloud regions。
us-east-1– US 东部(弗吉尼亚北部)us-west-2– US 西部(俄勒冈州)us-east-2- US 东部(俄亥俄州)ca-central-1- Canada (Central)ap-northeast-1- 亚太地区(东京)ap-southeast-2- 亚太地区(悉尼)eu-central-1- EU(法兰克福)eu-west-1- EU(爱尔兰)eu-west-2- Europe (London)
交互式仓库和交互式表的限制¶
The following limitations apply to interactive warehouses and interactive tables. Some limitations are due to architectural differences between interactive tables and standard Snowflake tables; those limitations are intended to be permanent.
交互式仓库的限制¶
Snowflake interactive warehouses don't support long-running queries. The query timeout for SELECT commands defaults to five seconds. After five seconds, the query is canceled. You can reduce the query timeout value, but you can't increase it. Other kinds of commands, such as SHOW and INSERT OVERWRITE, aren't subject to the five-second timeout interval.
If a query consistently times out, that's a signal that it might not be suitable for use with interactive warehouses. Otherwise, you need to apply some of the performance tuning techniques to reduce the time to less than five seconds.
An interactive warehouse is always up and running by design. It doesn't automatically suspend when idle. Although you can manually suspend an interactive warehouse, expect significant query latency when you resume the warehouse.
You can't query standard Snowflake tables from an interactive warehouse. To query both standard tables and interactive tables in the same session, run USE WAREHOUSE to switch to the appropriate warehouse type depending on the type of table.
If an interactive warehouse is a multi-cluster warehouse, it doesn't auto-scale. In a multi-cluster interactive warehouse, always keep MIN_CLUSTER_COUNT and MAX_CLUSTER_COUNT set to the same value.
You can't run CALL commands to call stored procedures in an interactive warehouse.
You can't use the
->>pipe operator. That operator uses stored procedures behind the scenes.Interactive warehouses currently don't support replication. They aren't included in failover groups and replication groups.
交互式表的限制¶
交互式表不支持以下功能:
Data manipulation language (DML) commands such as UPDATE and DELETE. The only DML that you can perform is INSERT OVERWRITE.
Replication. They aren't included in failover groups and replication groups.
故障安全。此数据恢复机制不适用于交互式表。您仍然可以将 Time Travel 与交互式表结合使用。
Query insights are currently not collected or available for queries executing on interactive tables.
交互式表目前不支持 搜索优化服务。
您不能执行以下操作:
Use an interactive table as the source for a materialized view.
Modify properties of an interactive table by using ALTER TABLE clauses such as ADD COLUMN or REMOVE COLUMN. ALTER TABLE operations that you can perform include:
Renaming the table.
修改列以设置或取消设置注释。
设置或取消设置列的掩码策略。
Adding a storage lifecycle policy to the table, or dropping a storage lifecycle policy from the table.
Use streams with an interactive table.
Create a dynamic table with an interactive table as a base table.
Use the RESAMPLE clause for queries on an interactive table.
使用 CREATE INTERACTIVE TABLE 或 ALTER TABLE 设置 Time Travel 保留期。交互式表会继承父架构、数据库或账户中的值 DATA_RETENTION_TIME_IN_DAYS。
开始使用交互式表¶
要开始使用交互式表,请完成以下步骤序列:
使用标准仓库创建交互式表。有关更多信息,请参阅 创建交互式表。
创建交互式仓库。有关更多信息,请参阅 创建交互式仓库。
恢复交互式仓库。有关更多信息,请参阅 恢复和暂停仓库。
将交互式表添加到交互式仓库。有关更多信息,请参阅 将交互式表添加到交互式仓库。
开始通过交互式仓库查询交互式表。有关更多信息,请参阅 查询交互式表。
使用交互式表和交互式仓库¶
以下过程说明如何创建和管理使用交互式表运行查询所需的所有对象。首次尝试此功能时,请按以下顺序执行这些过程。
创建交互式表¶
表创建遵循标准 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;
有关选择相应滞后时间以平衡成本和数据新鲜度的更多信息,请参阅 How Snowflake schedules refreshes。与动态表类似,交互式表也适用类似的注意事项。
创建交互式仓库¶
创建交互式表后,要实现最佳查询性能,需要使用交互式仓库。在 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';
创建交互式仓库后,仓库默认无限期保持活动状态。与传统仓库不同,交互式仓库不包含闲置一段时间后自动暂停的选项。
Interactive table performance considerations¶
以下章节介绍如何解决由于交互式表的特殊特征及其更适合的工作负载而可能遇到的性能问题。
交互式仓库的查询最佳实践¶
交互式仓库针对具有 选择性工作负载 的查询进行了优化。这意味着与其他查询类型相比,具有良好选择性的查询在性能方面有更多的改进。
期望通过交互式仓库获得更多的性能优势 |
期望通过交互式仓库获得有限的性能优势 |
|---|---|
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());
询问一整年的数据会降低此查询的选择性。如果数据集很大,此查询可能会处理表中的所有行。 |
Other complexities such as large joins (for example, by joining two fact tables), or compute-intensive expressions such as regular expressions, might result in lower concurrency due to higher use of compute resources. See 选择交互式仓库的大小 for information about optimizing for those situations.
交互式表的数据布局最佳实践¶
交互式表遵循标准 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 ...
有关选择最佳群集密钥的更多详细信息,请参阅 群集密钥和聚类表。
选择交互式仓库的大小¶
完成所有查询和布局优化后,请考虑 扩展仓库 以满足需求。交互式仓库的大小范围从 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 延迟)¶
A sudden increase in query time is likely due to insufficient caching. Each warehouse size has a local SSD cache that Snowflake uses to cache the most recently used data. Snowflake manages the cache to only store parts of the table that are accessed frequently. If your queries are selective, then increasing warehouse size can potentially reduce tail latency.
另请注意,新启动的仓库需要一段时间才能 预热缓存。Snowflake 会主动预热新添加的数据。对于基准测试,请在开始基准测试之前等待一段时间,以便缓存有时间预热。缓存预热速度基于仓库大小和表大小。交互式表越大,Snowflake 预热缓存所需的时间就越长。另一方面,指定的交互式仓库规模越大,预热时间越短。
Problem 3: My query is queuing or I'm not able to achieve the expected concurrency¶
您可以通过设置 MIN_CLUSTER_COUNT 和 MAX_CLUSTER_COUNT 参数来扩展仓库规模。这样,您就可以创建多群集交互式仓库。目前,多群集交互式仓库不支持自动扩展。因此,请为最小和最大群集计数指定相同的值。由于预热仓库需要时间,因此手动扩展往往可以为用户提供更好的经济效益,同时仍能实现可预测的性能。
将交互式表添加到交互式仓库¶
要获得交互式表的最佳查询性能,应使用交互式仓库。
Before you can query the interactive table from an interactive warehouse, you must perform a
one-time operation to add the interactive table to the interactive warehouse. Otherwise, you'll see
an object not found error when running a query against such a table from the interactive
warehouse. If you didn't specify the interactive tables to associate with the interactive warehouses
by using the TABLES clause in your CREATE INTERACTIVE WAREHOUSE command, you can do that later by
using an ALTER WAREHOUSE command.
以下命令将 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 表(例如标准表或混合表),请先切换到标准仓库。
某些类型的查询特别适合交互式表。有关更多信息,请参阅 交互式表的用例。
基准测试最佳实践¶
在测试环境中评估交互式表的性能时,请遵循以下最佳实践,以避免出现不一致或误导性的结果:
关闭查询结果缓存,使多次基准测试运行之间的基准测试结果保持一致。您可以通过设置 USE_CACHED_RESULT 会话参数,在账户、用户和会话级别关闭查询结果缓存。这样一来,查询仅使用来自交互式仓库的表数据缓存。如果您在生产环境中打开结果缓存,您可以获得与基准测试相当或更好的性能。
由于交互式仓库需要一些时间来预热表数据缓存,因此在创建或恢复交互式仓库后,请等待一段时间,然后再测试查询性能。这模拟了仓库长时间保持活动状态的典型生产配置。Snowflake 对缓存预热过程进行了优化。因此,让 Snowflake 完成此过程比通过运行示例查询自行预热缓存更高效。
在将交互式表的性能与标准 Snowflake 表进行比较时,不要在标准表和交互式表之间交错查询。应先在标准表上运行完整的基准测试,然后在交互式表上运行相同的测试。
在与其他数据库系统进行比较基准测试时,请确保交互式表中的群集列与查询中的 WHERE 子句谓词匹配。有关选择最佳群集列的更多信息,请参阅 群集密钥和聚类表。尤其要注意,请勿对具有高基数(例如唯一 IDs 或时间戳)的列进行聚类。
如果查询简短且简单,则可以将交互式仓库的 MAX_CONCURRENCY_LEVEL 参数设置为更高值,从而实现更高的并发性。
Interactive tables and storage lifecycle policies¶
您可以使用 存储生命周期策略,根据您定义的条件(例如数据存在时间或其他标准),来归档或使特定表行过期。
目前,您不能对使用自动刷新的交互式表使用存储生命周期策略。您可以使用 TARGET_LAG 参数或存储生命周期策略,但不能同时使用两者。
成本和计费注意事项¶
Interactive warehouses incur compute charges when active. The minimum billable period for an interactive warehouse is one hour, and at one-second granularity thereafter.
备注
如果您恢复已暂停的交互式仓库,该操作将产生新的最低计费周期费用。即便您因仓库中其他近期活动已在该周期内产生费用,该费用仍然会被收取。因此,建议避免在短时间内多次暂停和恢复交互式仓库,例如为了调整多集群交互式仓库中的集群数量。
交互式表会产生标准存储成本。交互式表的存储价格与标准表相同。由于数据编码和附加索引的差异,交互式表可能大于等效的标准表。较大的数据大小和索引会计入存储卷。
有关交互式仓库和交互式表的成本和计费的更多信息,请参阅 Snowflake 服务使用量表。
受影响的 SQL 语句¶
此功能对以下 Snowflake SQL 命令进行了更改:
ALTER WAREHOUSE:新增 ADD TABLES 和 DROP TABLES 子句。
CREATE INTERACTIVE TABLE:使用所需的 CLUSTER BY 子句创建交互式表。
CREATE INTERACTIVE WAREHOUSE:使用可选的 TABLES 子句创建交互式仓库。