Cassandra - 在集群列上使用 IN 运算符更新 table
Cassandra - update table using IN operator on a clustering column
我有以下 table
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: Error from server: code=2200 [Invalid query] message="Some clustering keys are missing: group_id"
为什么会出现这个错误?
1.此查询是否在保存数据的节点上执行一次?或者它执行了 3 次 - IN 运算符中的每个 group_id 值执行一次?
由于查询是针对单个分区键进行匹配的,因此它仅在属于具有此数据的节点中执行。希望负载平衡策略是 TokenAware 并且一致性是 1 或 local_quorum。
此更新查询也只执行一次,因为单个目标分区键。请记住 Cassandra 是仅附加系统,在 writes/updates 之前没有读取,因此这些更新本质上是附加到新的 SSTable 并且生活是美好的:)
2。有没有更好的方法(性能方面)来完成此更新?
只要更新语句不影响多个分区,就应该没问题。此外,我们只讨论了三个 "group_id" 列值,此查询应该可以正常工作。如果 IN 查询倾向于增长到三位数,比如 100 个集群列值,那么您将开始看到读取此分区键期间的延迟影响。
3。我试图 运行 这个查询而不在 WHERE 子句中提供 group_id 但这导致了以下错误
InvalidRequest:来自服务器的错误:code=2200 [无效查询] message="Some clustering keys are missing: group_id"
为什么会出现这个错误?
该错误实质上表明您无法仅使用分区列来更新行。因为它不知道要应用写入的所有聚类列是什么。
对于给定的分区键,可能有 1000 多个集群列。因此,如果没有限定聚簇列,Cassandra 将不知道分区键中的哪一行受到影响,哪些行没有受到影响。
我有以下 table
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: Error from server: code=2200 [Invalid query] message="Some clustering keys are missing: group_id"
为什么会出现这个错误?
1.此查询是否在保存数据的节点上执行一次?或者它执行了 3 次 - IN 运算符中的每个 group_id 值执行一次?
由于查询是针对单个分区键进行匹配的,因此它仅在属于具有此数据的节点中执行。希望负载平衡策略是 TokenAware 并且一致性是 1 或 local_quorum。 此更新查询也只执行一次,因为单个目标分区键。请记住 Cassandra 是仅附加系统,在 writes/updates 之前没有读取,因此这些更新本质上是附加到新的 SSTable 并且生活是美好的:)
2。有没有更好的方法(性能方面)来完成此更新?
只要更新语句不影响多个分区,就应该没问题。此外,我们只讨论了三个 "group_id" 列值,此查询应该可以正常工作。如果 IN 查询倾向于增长到三位数,比如 100 个集群列值,那么您将开始看到读取此分区键期间的延迟影响。
3。我试图 运行 这个查询而不在 WHERE 子句中提供 group_id 但这导致了以下错误 InvalidRequest:来自服务器的错误:code=2200 [无效查询] message="Some clustering keys are missing: group_id" 为什么会出现这个错误?
该错误实质上表明您无法仅使用分区列来更新行。因为它不知道要应用写入的所有聚类列是什么。
对于给定的分区键,可能有 1000 多个集群列。因此,如果没有限定聚簇列,Cassandra 将不知道分区键中的哪一行受到影响,哪些行没有受到影响。