Snowflake cloud data platform Snowflake在同一个表上运行多个合并语句
我有一个非常大的表(40多亿行),结构如下:Snowflake cloud data platform Snowflake在同一个表上运行多个合并语句,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我有一个非常大的表(40多亿行),结构如下: user_id month nb_logins ----------------------------- 1 01 0 1 02 1 1 03 4 1 04 0 ... ... ... 2 01 5 2 02 0 2
user_id month nb_logins
-----------------------------
1 01 0
1 02 1
1 03 4
1 04 0
... ... ...
2 01 5
2 02 0
2 03 0
2 04 1
我想添加一个新的列,它仅仅是nb\u登录的累计总和,由user\u id
划分,并按month
排序
我过去常常在一个查询中计算整个过程,但是我决定将其并行化,因为每个用户都是独立的(即,我可以并行地计算用户1和用户2的总和)
现在,为了并行化,我创建了一个基于用户id
的“分区”列表(它是一个均衡的int),假设我有以下两个分区:
用户id介于0和10之间
11到20之间的用户id
因此,我并行运行了两个MERGE
请求,每个分区一个,但是我发现大多数请求在雪花中被阻塞,因为它们试图写入同一个微分区
问题:并行化此操作的最佳方式是什么?当您说按用户id
分区并按月份
排序时,您的确切意思是什么?您是否正在加载按user\u id,month
排序的表?请注意,这被阻止的原因很可能是因为雪花微分区上的分区不是绝对的。您可能至少有一个包含多个user_id值的微分区,这将为最先到达的语句创建分区锁。实际上,您最好将此语句保留为单个语句,并使您的仓库更大,以便在一次传递中处理更多的语句。不,我的意思是以“窗口函数”的方式进行分区和排序,这意味着这是可并行的。是的,我已经调整了仓库的大小,尽管我仍然想找到一种方法来并行化这个操作。从今天起,我将值存储在临时表中
,然后合并所有值的并集。您将获得一个锁,尝试对单个表执行多个合并语句。这可不是个好办法。您可能需要考虑将表物理地分隔为多个表,然后将视图放在表的联合上。如果您已经按照用户id进行了分区,那么我假设查询通常已经按照用户id进行了过滤。在这种情况下,Snowflake将知道只点击联合所有必要的表以提供结果。当您说按用户id划分,按月份排序时,您的确切意思是什么?您是否正在加载按user\u id,month
排序的表?请注意,这被阻止的原因很可能是因为雪花微分区上的分区不是绝对的。您可能至少有一个包含多个user_id值的微分区,这将为最先到达的语句创建分区锁。实际上,您最好将此语句保留为单个语句,并使您的仓库更大,以便在一次传递中处理更多的语句。不,我的意思是以“窗口函数”的方式进行分区和排序,这意味着这是可并行的。是的,我已经调整了仓库的大小,尽管我仍然想找到一种方法来并行化这个操作。从今天起,我将值存储在临时表中
,然后合并所有值的并集。您将获得一个锁,尝试对单个表执行多个合并语句。这可不是个好办法。您可能需要考虑将表物理地分隔为多个表,然后将视图放在表的联合上。如果您已经按照用户id进行了分区,那么我假设查询通常已经按照用户id进行了过滤。在这种情况下,雪花将知道,为了提供一个结果,它只会击中联盟所有必要的表格。