在雪花中缓存

Posted

技术标签:

【中文标题】在雪花中缓存【英文标题】:Caching in Snowflake 【发布时间】:2021-02-08 13:34:44 【问题描述】:

试图了解哪些 SQL 可用于结果缓存。

考虑多个脚本从一个大表中提取数据,然后执行不同的操作。 如果我们在应用所有脚本中使用的通用过滤器后使用 BIG 表创建一个易失性表,为什么不使用结果缓存。考虑到 BIG 表数据不会改变。

在下面的示例中,Script1 Step 1 将使用 Compute。其他脚本中的相同步骤是使用Compute还是使用Result Cache

脚本1: 第 1 步:创建易失性表 VT_TEST (从 BIG_TABLE 中选择 COL1、COL2,其中 CODE='TEST')

第 2 步:更新 VT_TEST SET COL1='TEST1'

脚本2: 第 1 步:创建易失性表 VT_TEST (从 BIG_TABLE 中选择 COL1、COL2,其中 CODE='TEST')

第 2 步:更新 VT_TEST SET COL1='TEST2'

脚本: 第 1 步:创建易失性表 VT_TEST (从 BIG_TABLE 中选择 COL1、COL2,其中 CODE='TEST')

第 2 步:更新 VT_TEST SET COL1='TESTn'

【问题讨论】:

【参考方案1】:

答案是也许。在讨论结果集缓存重用的文档部分中,它列出了使用结果集缓存必须满足的七个条件。如果满足所有七个,它可以使用结果集缓存但不能保证。

如果要保证Snowflake使用结果集缓存,可以使用result_scan表函数:

use warehouse test;

-- Grab some rows
select * from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."ORDERS" limit 1000;

-- Set the id variable for later use
set id = last_query_id();

-- Suspend the warehouse to show it won't resume on next statement
alter warehouse test suspend;

-- Use a result from the result set cache
select * from table(result_scan($id));

在许多甚至大多数情况下,您根本不需要创建易失性表。您可以简单地执行一个返回行的查询,并在 24 小时内重复使用来自结果集缓存的结果。换句话说,与其将插入作为选择进行,不如简单地进行选择并获取查询 ID。然后,您可以使用结果集缓存中的结果 24 小时。

【讨论】:

谢谢格雷格。假设我正在使用 SnowSQL 编写一个表加载过程,其中执行多个 SQL 语句以转换来自不同表的数据。通常,我们使用易失性表来存储中间数据,这些数据用于进一步的连接/转换。执行 SELECT 而不是创建 Volatile Table,我假设它会将所有行写入 SnowSql 日志。 即使这个 LAST_QUERY_ID() 也只捕获这个会话的 id。或者考虑企业 Prod 工作负载的 Snowflake 帐户并行运行的任何会话 LAST_QUERY_ID() 适用于当前会话。 result_scan() 表函数将为同一用户工作 24 小时。如果您需要从不同的会话访问结果集缓存,请获取查询 ID 并将其存储在某处以供以后使用。 result_scan 表函数像临时表一样运行,但它是 24 小时而不是会话的持续时间。您必须通过查询 ID 或使用 last_query_id() 函数来引用它。您还可以在 last_query_id() 的参数中指定 -1、-2 以指定发生 2 次、3 次等的查询,但始终针对该会话。 谢谢格雷格。我的第一个关注点呢?如果我在 SnowSQL 中运行选择列并尝试在单独的 SnowSQL 脚本中使用该结果,它不会将结果写入日志让假设我正在从 Linux 运行脚本 它只会将行返回给执行选择的 SnowSQL 会话。

以上是关于在雪花中缓存的主要内容,如果未能解决你的问题,请参考以下文章

访问 Snowflake 中的结果缓存会消耗计算积分吗?

雪花中的哪些操作不消耗计算积分?

雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

高级数据结构 ---- 跳跃表布隆过滤器一致性哈希雪花算法

高级数据结构 ---- 跳跃表布隆过滤器一致性哈希雪花算法