Snowflake update语句锁定整个表,并将其他update语句排队



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

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

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

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

选项1是在数据模型中伸缩的理想选择。但既然你不能让它发生,你可以用选项2。

你也可以把所有的更新放在一个暂存表中,然后批量执行upsert——删除和插入而不是更新。看看你是否能承受得起延误。

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

相关内容

  • 没有找到相关文章

最新更新