雪花中单个行的更新效率如何。我们可以使用雪花作为事务数据库吗?
答案 0 :(得分:0)
Snowflake是一个批处理更新系统,已优化用于附加新的数据记录,而Rockset是一个就地更新系统,并且已优化用于添加新记录以及覆盖现有数据记录。 Snowflake更新针对数据仓库工作负载进行了优化,而Rockset针对Operational Analytics进行了优化。
许多雪花群集使用中央FoundationDB数据库来存储有关组织中所有这些群集的元数据。元数据群集维护从表名到表中S3文件集的映射。每个S3文件包含几千条记录,通常为几兆字节(例如64-100 MB)。 S3文件中的数据是列压缩的。列压缩的优点是较小的文件大小,导致在S3和雪花服务之间进行高效,快速的数据传输,缺点是无法就地进行对现有记录的更新,因为您无法更新部分列压缩的数据在S3文件中。 Snowflake使用S3文件的写时复制模式来支持更新。让我们使用两个雪花簇A和B的场景对此进行解释。
在集群A上对表的单个记录进行更新时,雪花软件将读取支持的S3文件,在内存中对其进行更新,然后将整个64 MB文件刷新到一个新的S3对象中(本质上是复制副本)。写入整个S3文件)。然后,它将使用新的元数据更新FoundationDB。群集B通过FoundationDB获得此更新,并重新读取新的S3对象并开始提供新数据。写入将在几秒钟内显示在群集B中。
现在,对于您来说,显而易见的是,上述系统面临的挑战是覆盖的数量。通过针对每个单独的更新(每个S3文件而不是每个单独的记录的写时复制)写入/读取整个S3对象,将更新从一个群集传播到另一个群集。这意味着如果更新100字节的记录,这将导致群集B从S3读取64 MB的数据(假设S3对象为64 MB)。
因此,如果您的更新少于每秒几秒钟,则雪花效果很好。或者,如果您将所有更新批处理5-10分钟,然后通过一次更新将它们插入雪花,那将非常有用。但是任何更高的更新率都会导致问题。
另一方面,Rockset使用名为RocksDB-Cloud的可变键值存储,Rockset将单个记录切分成一组键值,并将每个键值插入RocksDB-Cloud。 RocksDB-Cloud是RocksDB的云版本,并使用为快速更新而优化的LSM树,这意味着可以更新单个记录,而不必对整个S3文件进行写时复制。 Rockset集合每秒可以支持数千次覆盖。请参阅RocksDB performance benchmark中标题为“随机写入”的部分。