我有下表
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”
为什么会发生此错误?
答案 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就不会知道分区密钥中的哪一行受到影响,哪些不受影响。