Cassandra Batch语句 - 多个表

时间:2018-03-19 06:29:49

标签: cassandra cassandra-3.0

我想使用批处理语句从我的数据库中的3个表中删除一行以确保原子性。所有3个表中的分区键都是相同的。在我读到的关于批处理语句的所有示例中,所有查询都是针对单个表的?就我而言,使用批处理语句是个好主意吗?或者,我应该避免吗?

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

1 个答案:

答案 0 :(得分:3)

是的,您可以使用批处理来确保原子性。单个分区批处理更快(相同的表和相同的分区键),但仅限于有限数量的分区(在您的情况下为三个),这是可以的。但是不要将它用于性能优化(例如:减少多个请求)。如果你需要原子性,你可以使用它。

您可以查看以下链接:

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?

<强> EDITED

  
    

就我而言,表格不同,但所有3个表格中的分区键都相同。那么这是单个分区批处理的特殊情况还是完全不同的东西。

  

对于不同的表,分区也不同。所以这是一个多分区批处理。 LOGGED 批处理用于确保不同分区(不同表或不同分区键)的原子性。 UNLOGGED 批次用于确保单个分区批处理的原子性和隔离。如果对多分区使用 UNLOGGED 批处理,将无法确保批处理原子性。默认为 LOGGED 批次。对于单个分区批处理,默认为 UNLOGGED 。导致单个分区批处理被视为单行突变。对于单行更新,无需使用 LOGGED 批处理。要了解 LOGGED UNLOGGED 批次,我在下面分享了一个链接。

  

多分区批处理应仅用于实现不同表上的一些写入的原子性。除此之外,他们应该避免,因为他们太贵了。

     

单个分区批次可用于实现原子性和隔离。它们并不比普通的写作贵得多。

但是您可以使用多分区 LOGGED 批处理,因为分区是有限的。

一个非常有用的批量文档,并提供了所有细节。如果你读到这个,所有的混淆都将被清除。

Cassandra - to BATCH or not to BATCH

分区密钥令牌与行分区

表分区和分区键令牌是不同的。分区键用于决定数据所在的节点。对于相同的行密钥分区令牌是相同的,因此驻留在同一节点中。对于不同的分区键或相同的键不同的表,它们是不同的行变异。即使对于相同的密钥,也无法通过一个查询获取不同分区键或不同表的数据。协调器节点必须将其视为不同的请求或变异,并分别从复制节点请求实际数据。它是C *如何存储数据的内部结构。

  

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

Does the same partition key in different cassandra tables add up to cell theoretical limit?

要了解C *如何映射数据的详细信息,请查看此链接:

Understanding How CQL3 Maps to Cassandra's Internal Data Structure