Cassandra批量语句-多表

11

我想使用批处理语句从我的数据库中删除3个表中的一行,以确保原子性。在所有3个表中,分区键将是相同的。在所有我阅读关于批处理语句的例子中,所有的查询都是针对单个表吗?在我的情况下,使用批处理语句是否是一个好主意?还是应该避免使用它?

我正在使用Cassandra-3.11.2,并使用C ++驱动程序执行我的查询。

2个回答

6
是的,您可以使用批处理来确保原子性。单分区批次更快(相同表和相同分区键),但仅适用于有限数量的分区(在您的情况下为三个)是可以的。但不要将其用于性能优化(例如减少多个请求)。如果需要原子性,则可以使用它。
您可以查看以下链接: Cassandra batch query performance on tables having different partition keys Cassandra batch query vs single insert performance How single parition batch in cassandra function for multiple column update? 编辑:
在我的情况下,表是不同的,但所有3个表的分区键都相同。那么这是单分区批处理的特殊情况还是完全不同的情况?
对于不同的表,分区也是不同的。因此这是一个多分区批处理。使用LOGGED批处理可以确保不同分区(不同表或不同分区键)的原子性。使用UNLOGGED批处理可以确保单个分区批处理的原子性和隔离性。如果您将UNLOGGED批处理用于多分区批处理,则无法确保原子性。默认为LOGGED批处理。对于单个分区批处理,默认为UNLOGGED。因为单个分区批处理被认为是单行变异。对于单行更新,没有必要使用LOGGED批处理。要了解LOGGEDUNLOGGED批处理,请查看下面的链接。

仅应使用多分区批处理来实现对不同表的少量写入的原子性。除此之外,它们应该被避免,因为它们太昂贵了。

可以使用单个分区批处理来实现原子性和隔离性。它们的成本与普通写入相差不大。

但是,由于分区有限,您可以使用多分区LOGGED批处理。

这是一篇关于批处理的非常有用的文档,提供了所有细节。如果您阅读此文档,则所有疑惑都将被解决。

卡桑德拉 - 批处理还是非批处理

分区键令牌 vs 行分区

表分区和分区键令牌是不同的。分区键用于决定数据所在的节点。对于相同的行键分区令牌相同,因此位于同一节点。对于不同的分区键或相同键的不同表,它们是不同的行变异体。即使对于相同的键,也不能使用一个查询从不同的分区键或不同的表中获取数据。协调员节点必须将其视为不同的请求或变异,并单独从复制的节点请求实际数据。这是 C* 存储数据的内部结构。

每个表甚至都有自己的目录结构,清楚地表明来自一个表的分区永远不会与另一个表的分区交互。

相同的卡桑德拉表中的分区键是否累加到单元格理论极限?

要了解C*如何映射数据,请查看此链接:

理解CQL3如何映射到Cassandra的内部数据结构


1
在我的情况下,表是不同的,但所有3个表的分区键都相同。那么这是单分区批处理的特殊情况还是完全不同的情况呢?实际上,在C++驱动程序中,“CASS_BATCH_TYPE_LOGGED”建议用于跨多个分区的变异,“CASS_BATCH_TYPE_UNLOGGED”建议用于单个分区。我只是想确保在我的情况下(3个表),我可以使用“UNLOGGED”类型。 - Vishal Sharma
2
之前我认为具有相同分区键的不同表将具有相同的分区。但你说这并非如此。你能详细说明为什么会这样吗?因为根据我的理解,分区键用作哈希函数的输入,哈希将决定数据将写入哪个节点。如果所有3个表的分区键都相同,为什么不应该是单个分区的情况呢? - Vishal Sharma
1
嗨@Chaity,这个链接-https://www.datastax.com/dev/blog/row-level-isolation指定了“对于原子性,保证实际上跨越列族(在同一个键空间内):即使是不同的列族,相同分区键的更新也会被原子地持久化。”,而实现细节指定为对于在不同表中更新相同分区键的情况,将创建单个RowMutation并以原子方式执行。这是否意味着对于不同表中的相同分区键,数据存储在同一分区中? - user1571307
“对于不同的表,分区也是不同的”这部分内容是不正确的,根据Datastax文档。请参阅https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/useBatchGoodExample.html上的“注意事项:”。 - pdxleif

0

是的,根据Cassandra文档,这是BATCH的一个很好的使用案例。请参阅https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/useBatchGoodExample.html上的“注意事项”。

如果同一keyspace中有两个不同的表,并且这两个表具有相同的分区键,则此场景被视为单个分区批处理。每个表将有一个单独的变更。这是因为这两个表可能具有不同的列,即使keyspace和分区相同。批处理允许调用者将多个操作捆绑到单个批处理请求中。所有操作都由同一协调器执行。批处理请求的最佳用途是在同一keyspace中的多个表中的单个分区。此外,批处理提供了变更将按特定顺序应用的保证。

具体而言,如果它们具有相同的分区键,则将被视为单个分区批处理。因此:“批处理请求的最佳用途是在同一keyspace中的多个表中的单个分区。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接