嗨,按照下面提到的链接 溢出描述为"当 Snowflake 无法在内存中容纳操作时,它会首先开始将数据溢出到磁盘,然后溢出到远程存储。
部分#1
-无法在内存中容纳操作:这是否意味着仓库的内存大小很小,无法处理工作负载并且查询进入排队状态?
除了联接操作之外,还有哪些操作可能导致此问题?
部分#2
-它开始首先将数据溢出到磁盘,然后溢出到远程存储:在这种情况下,磁盘指的是什么,因为我们知道仓库只是没有磁盘的计算单元。
这是否意味着无法放入仓库内存的数据将溢出到存储层?
-所谓的"远程存储"。这是否意味着内部阶段?
请帮助了解雪花中的磁盘溢出。
https://community.snowflake.com/s/article/Recognizing-Disk-Spilling
内存是计算服务器内存(访问速度最快(,本地存储是附加到 EC2 的 EBS 卷,远程存储是 S3 存储(访问速度最慢(。
这种溢出会对查询性能产生深远的影响(尤其是在使用远程磁盘进行溢出时(。为了缓解这种情况,建议:
使用较大的仓库(有效地增加操作的可用内存/本地磁盘空间(和/或 以较小的批次处理数据。
文档参考:https://docs.snowflake.com/en/user-guide/ui-query-profile.html#queries-too-large-to-fit-in-memory
是的,远程溢出是 S3(本地是本地实例缓存( - 通常当涉及到远程溢出时,情况非常糟糕,查询的性能受到影响。
除了重写查询之外,您可以随时尝试在文档中提到的更好的仓库上运行它 - 它将拥有自己的更多缓存,并且溢出应该会显着减少。
JOIN 的变体(如 FLATTEN(会创建更多的行和聚合操作(如 COUNT DISTINCT(。
就在昨天,我在两年内做了一些COUNT DISTINCTs的数据,每月汇总,它正在溢出到本地和远程。
我意识到当我想要COUNT(*)
所有这些值对已经不同时正在做COUNT(DISTINCT column1,column2)
,并且停止了远程溢出,并且为了避免一些/大部分本地溢出,我将 SQL 分成 1 年大小的批次(数据按时聚类,因此读取不会浪费(, 并将结果集插入到表中。最后,与中型仓库相比,我在超大仓库上运行了批次。
我不知道本地/远程磁盘的确切答案在哪里,但许多 EC2 实例有些带有本地磁盘,因此他们可能使用这些实例,否则可能是 EBS。我相信远程是 S3。
但这个故事的寓意是,只是一台使用交换内存的PC,不仅操作立即失败是件好事,而且大多数时候如果它失败了,你会更好,因为它需要多长时间是痛苦的。