我读过很多关于雪花缓存的文章,但不明白雪花如何绕过其他“共享所有体系结构”所遇到的数据新鲜度问题。我的理解是,当数据发生变化时,共享一切,本质上需要一些锁定。
正如在这篇文章中所解释的
为了提高效率,两个节点都在内存中缓存了记录1的本地副本。然后,客户端尝试更新记录1,以便“foo”变成“bar”。要以一致的方式执行此操作,DBMS必须在所有可能缓存了记录1的节点上使用分布式锁。随着集群中机器数量的增加,这种分布式锁变得越来越慢,因此可能会阻碍写入过程的可伸缩性。
换句话说,如果雪花正在计算层中缓存数据,但是底层数据在S3中发生变化,那么雪花不会遇到其他共享所有体系结构的相同的缓存问题吗?我知道,在分析数据库中,更新较少,但为什么传统的共享体系结构不能工作呢?
我看到的唯一答案是雪花有一个查询优化器,它检查底层数据是否发生了变化。但是,仍然不理解这/这是一个重要的升级缓存策略的传统共享-所有的DBs。
发布于 2021-11-03 22:54:25
我相信你在这里缺少的关键概念是雪花从不更新record...ever。相反,它将创建一个新的,该分区包含来自旧微分区的所有数据以及应用的更改。这样,雪花服务层立即知道仓库缓存中的微分区不再有效,因为根据服务层,它不再是活动的。
唯一需要锁的时间是在“更新”缓存或底层数据时。这在这里从来没有发生过。一旦update语句完成,新的微分区就会激活。当更新正在运行时,没有数据的“脏”状态,因此对该表运行的任何查询都将始终是更新运行时的前一状态或更新后状态。不需要锁。
这能回答你的问题吗?
https://stackoverflow.com/questions/69830425
复制相似问题