为啥 Snowflake 中这两个相似的查询具有非常不同的性能?

Posted

技术标签:

【中文标题】为啥 Snowflake 中这两个相似的查询具有非常不同的性能?【英文标题】:Why these 2 similar queries in Snowflake have very different performance?为什么 Snowflake 中这两个相似的查询具有非常不同的性能? 【发布时间】:2020-01-21 18:48:52 【问题描述】:

查看这 2 个 Snowflake 查询的个人资料图片。他们正在做类似的工作(用小表更新相同的 370M 表连接(一种情况是 21k,另一种是 9k),但性能结果是 5x)。 查询完成了大约 15 分钟,使用了一个 xsmall VDW: Fast query finished around 15 mins

这个查询,更新同一个 370M 行的表,加入一个 9k 的小 DIM 表,但在 1 小时 30 分钟后仍然运行 Still, running after 90 minutes

从查询配置文件中,我无法解释为什么第二个查询的运行速度比第一个慢得多。第二个在第一个之后运行。

有什么想法吗?谢谢

【问题讨论】:

溢出到本地存储是产生大量数据的标志。这看起来像一个问题,我们最近打开了一个错误,我将一个事实表连接到 3 个维度表(用于 5 行数据)并且第三个表被连接了两次,如果所有 4 个连接都发生在过滤器上的时间范围连接,那么查询爆炸并运行 6 小时(我们的最长运行时间),就好像你让一个暗淡不加入或删除加入之间的时间它不会爆炸并返回亚秒。也就是说,没有看到你的 SQL 发生了什么,但如果它与我的故事相似,我会打开一个支持案例。 您的查询不同,您没有提供连接条件或数据样本。你能提供更多细节吗? 【参考方案1】:

在第二个查询中,您可以看到 溢出到本地存储的字节数为 272gb。这意味着处理中完成的工作太大而无法放入集群内存中,因此不得不溢出到本地连接的 SSD。从性能的角度来看,这是一项代价高昂的操作,我认为可能是为什么第二个查询需要这么长时间才能运行(查询 1 只有 2gb 的溢出)。最简单的解决方案是增加 VDW 的大小 - 或者您可以重写查询:

https://docs.snowflake.net/manuals/user-guide/ui-query-profile.html#queries-too-large-to-fit-in-memory

还要注意,查询 1 设法从 VDW 内存中读取了 100% 的数据集 - 这非常有效 - 而查询 2 只能在那里找到大约一半的数据集,因此必须执行远程 io(从云存储读取) 得到其余的。在运行查询 1 和 2 之前执行的查询/工作已将该信息检索到本地 VDW 缓存,并基于 LRU 保留此信息。

【讨论】:

Mike 所说的一切,另外,您还没有告诉我们是否有任何东西同时在同一个仓库中运行,以用于任一查询。如果多个(尤其是计算密集型)查询同时在同一个仓库上运行,它们就会竞争资源。衡量两个查询性能的最佳方法是在单独的仓库上运行它们,每个仓库手动启动并且不带结果缓存,不带任何其他在它们上运行的东西,并通过更改第二个查询以包含 WHERE TRUEAND TRUE。这使查询引擎认为第二个查询与第一个查询不同 此外,在运行速度更快的查询 (100%) 上,从缓存中读取的数据更多。这可能有点帮助。但溢出是#1 最有可能发生的情况。使用更大的仓库!【参考方案2】:

慢查询的连接产生的行数多于流入它的行数。这可以是你想要的,但通常它是由表中的重复值引起的。我会仔细检查这是否符合预期。

【讨论】:

以上是关于为啥 Snowflake 中这两个相似的查询具有非常不同的性能?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 YOLOv5 中这两个结果不同?

为啥 web2py 中两个逻辑相似的查询给出不同的结果?

Snowflake 我们如何在字段数组上运行非透视查询而不是显式声明每个字段?

SQL Server 中这两个循环删除查询有啥区别

雪花 - 在两个数组之间返回不同(不相似)的值

从Java中具有不同大小的2个数组列表中查找非相似元素