Snowflake - 缓存数据新鲜度
Snowflake - Caching with Data Freshness
我读了很多关于雪花缓存的文章,但不明白雪花是如何解决其他“共享所有架构”遇到的数据新鲜度问题的。我的理解是,当数据更改时共享所有内容,本质上需要一些锁定。
如 this article 中所述:
For efficiency both nodes have cached local copies of record 1 in memory. A client then tries to update record 1 so that ‘foo’ becomes ‘bar’. To do this in a consistent manner the DBMS must take a distributed lock on all nodes that may have cached record 1. Such distributed locks become slower and slower as you increase the number of machines in the cluster and as a result can impede the scalability of the writing process.
换句话说,如果 snowflake 在计算层缓存数据,但底层数据在 S3 中发生变化,那么 snowflake 运行 不会陷入与其他共享一切架构相同的缓存问题吗?我在分析数据库中了解到,更新较少,但为什么传统的共享一切架构不起作用?
我看到的唯一答案是 snowflake 有一个查询优化器,可以检查底层数据是否已更改。但仍然不明白 this/how 这是对传统共享所有数据库的缓存策略的重大升级。
我相信您在这里遗漏的关键概念是 Snowflake 永远不会更新记录……永远不会。相反,它会创建一个新的微分区,其中包含旧微分区中应用了更改的所有数据。这样,Snowflake的services层马上就知道仓库缓存中的一个Micro-Partition不再有效,因为根据services层,它已经不活跃了。
唯一需要锁的时候是“更新”缓存或基础数据。这永远不会发生在这里。一旦更新语句完成,新的微分区就会激活。虽然更新是 运行,但数据没有“脏”状态,因此针对该 table 运行的任何查询将始终是以前的状态,而更新是 运行 或post-更新状态。不需要锁。
这是否回答了您的问题?
我读了很多关于雪花缓存的文章,但不明白雪花是如何解决其他“共享所有架构”遇到的数据新鲜度问题的。我的理解是,当数据更改时共享所有内容,本质上需要一些锁定。
如 this article 中所述:
For efficiency both nodes have cached local copies of record 1 in memory. A client then tries to update record 1 so that ‘foo’ becomes ‘bar’. To do this in a consistent manner the DBMS must take a distributed lock on all nodes that may have cached record 1. Such distributed locks become slower and slower as you increase the number of machines in the cluster and as a result can impede the scalability of the writing process.
换句话说,如果 snowflake 在计算层缓存数据,但底层数据在 S3 中发生变化,那么 snowflake 运行 不会陷入与其他共享一切架构相同的缓存问题吗?我在分析数据库中了解到,更新较少,但为什么传统的共享一切架构不起作用?
我看到的唯一答案是 snowflake 有一个查询优化器,可以检查底层数据是否已更改。但仍然不明白 this/how 这是对传统共享所有数据库的缓存策略的重大升级。
我相信您在这里遗漏的关键概念是 Snowflake 永远不会更新记录……永远不会。相反,它会创建一个新的微分区,其中包含旧微分区中应用了更改的所有数据。这样,Snowflake的services层马上就知道仓库缓存中的一个Micro-Partition不再有效,因为根据services层,它已经不活跃了。
唯一需要锁的时候是“更新”缓存或基础数据。这永远不会发生在这里。一旦更新语句完成,新的微分区就会激活。虽然更新是 运行,但数据没有“脏”状态,因此针对该 table 运行的任何查询将始终是以前的状态,而更新是 运行 或post-更新状态。不需要锁。
这是否回答了您的问题?