Cassandra - 在聚类列上使用IN运算符更新表

时间:2018-02-20 07:39:09

标签: cassandra cassandra-3.0 cql3

我有下表
CREATE TABLE group ( tenant_id uuid, group_id uuid, display_name text, group_members set<uuid>, mail text, user_members set<uuid>, PRIMARY KEY (tenant_id, group_id) )
我想更新group_members字段并执行以下语句:

UPDATE group SET group_members = group_members - {7c796908-8c03-4b5d-afd1-4263dc1e469c} WHERE tenant_id = ac0d32ce-786f-4bfc-9b14-88008be2d19a AND group_id in (1ab11837-656a-463f-b7eb-2cbd1a178e49, aa18d888-8e5e-410f-8a67-ca2cb0e4e92c, 0fecc4c5-f49b-412e-b248-1b7c816a49c8)
我知道不建议在分区键上使用IN运算符,因为它会导致查询在多个节点上执行。但是在这里我提供了分区密钥,所以我认为这不会导致性能问题。

我的问题如下:

1.此查询是否在保存数据的节点上执行一次?或者它执行了3次 - 对于IN运算符中的每个group_id值一次?

2.有更好的方法(性能明智)来完成此更新吗?
3.我尝试运行此查询而不在WHERE子句中提供group_id,但这会导致以下错误

  

InvalidRequest:来自服务器的错误:code = 2200 [无效查询] message =“缺少某些群集密钥:group_id”

为什么会发生此错误?

1 个答案:

答案 0 :(得分:1)

1。此查询是否在包含数据的节点上执行一次?或者它执行了3次 - 对于IN运算符中的每个group_id值一次?

由于查询匹配单个分区键,因此它仅在属于具有此数据的节点中执行。希望负载均衡策略是TokenAware,一致性是one或local_quorum。    此更新查询也只执行一次,因为单个目标分区键。记住Cassandra只附加系统,写入/更新之前没有读取,因此这些更新基本上附加到新的SSTable上,生活很好:)

2。是否有更好的方法(性能明智)来完成此更新?

只要更新语句不影响多个分区,就应该没问题。我们也在谈论只说三个&#34; group_id&#34;列值此查询应该可以正常工作。如果IN查询趋向于增加到三位数,表示100个聚类列值,那么您将开始在读取此分区键期间看到延迟影响。

3。我尝试运行此查询而不在WHERE子句中提供group_id,但这会导致以下错误 InvalidRequest:来自服务器的错误:代码= 2200 [无效查询]消息=&#34;缺少某些群集密钥:group_id&#34; 为什么会出现这个错误?

该错误实质上表明您不能仅使用Partition列更新行。因为它不知道应用写入的所有聚类列是什么。

给定分区键可能有1000个聚类列。因此,如果没有合格的聚类列,Cassandra就不会知道分区密钥中的哪一行受到影响,哪些不受影响。