Snowflake update 语句锁定整个表并对其他更新语句进行排队

Snowflake update statements locks the entire table and queues other update statements

提问人:Krishna Kanna 提问时间:11/28/2022 更新时间:11/15/2023 访问量:534

问:

我们有一个用例,我们需要在 snowflake 中的同一个表上执行多个更新语句(每个更新不同的行集),而不会因更新查询的排队时间而造成任何延迟。目前,单个 update 语句大约需要 1 分钟才能执行,所有其他并发更新语句都被锁定(大约 40 条并发更新语句)并排队,因此包括等待时间在内的总时间约为 1 小时,但预期时间约为 2 分钟(假设所有更新语句同时执行,并且仓库大小支持同时 40 个查询,无需任何排队)。 避免这种锁定时间的最佳解决方案是什么?我们考虑了以下两个选项:-

  1. 对应用程序代码进行更改以批处理所有更新语句并作为一个查询执行 - 对于我们的用例来说是不可能的。
  2. 为每个客户端设置一个单独的表(每个更新语句,更新表中不同客户端的行) - 这样,所有更新语句都将在单独的表中执行,并且不会有任何锁定。

第二种方法是最好的方法,还是有任何其他解决方法可以帮助我们减少排队时间的延迟?

并发 sql-update snowflake-cloud-data-platform sqltransaction

评论


答:

0赞 Dinesh Kumar 11/28/2022 #1

由于 Snowflake 在更新期间锁定了表,因此预计会发生这种情况。

选项 1 非常适合在数据模型中进行缩放。但是,由于您无法实现它,因此您可以选择选项 2。

您还可以将所有更新放在一个临时表中,并批量执行更新插入 - 删除和插入而不是更新。检查您是否能承受延迟。

但如果你问我,雪花不应该用于原子更新。它必须是一个更新插入(删除和插入,也是批量的)。原子更新将有局限性。如果您的用例允许,请尝试使用基于行的存储,例如 Citus 或 MySQL。