Snowflake cloud data platform Snowflake在同一个表上运行多个合并语句

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

我有一个非常大的表(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          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进行了过滤。在这种情况下,雪花将知道,为了提供一个结果,它只会击中联盟所有必要的表格。