在 CQL 中使用元组操作对分区行进行切片
Slicing over partition rows using tuple operation in CQL
我正在尝试了解具有聚类键的元组运算符的行为。这是我试图做的事情:
create table sampletable (a int,b int,c int, d int, e int, primary key((a,b,c),d,e));
insert into sampletable(a,b,c,d,e) values(1,1,1,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,1,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,1,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,2,2,3);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,1,2,3);
cqlsh:mapro> select * from sampletable;
a | b | c | d | e
---+---+---+---+---
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 2
1 | 1 | 1 | 2 | 3
1 | 1 | 2 | 1 | 1
1 | 1 | 2 | 1 | 2
1 | 1 | 2 | 2 | 3
(6 rows)
-- Query1
cqlsh:mapro> select * from sampletable where a=1 and b=1 and c in (1,2) and (d,e)<(2,3);
a | b | c | d | e
---+---+---+---+---
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 2
1 | 1 | 2 | 1 | 1
1 | 1 | 2 | 1 | 2
(4 rows)
-- Query2
cqlsh:mapro> select * from sampletable where a=1 and b=1 and c in (1,2) and (d,e)<(2,9);
a | b | c | d | e
---+---+---+---+---
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 2
1 | 1 | 1 | 2 | 3
1 | 1 | 2 | 1 | 1
1 | 1 | 2 | 1 | 2
1 | 1 | 2 | 2 | 3
(6 rows)
我无法理解为什么查询 2 返回的结果与查询 1 不同。我的理解是 Cassandra 将首先应用所有分区键过滤,然后尝试应用元组排序,即 (d,e) <(2,3) 将作为 d<2 应用,并且在结果之上它将应用 e<3。我的理解错了吗?请帮忙。
在对列进行聚类的情况下,(a1, a2) < (b1, b2)
可以满足以下任何一种情况:
1) a1 < b1
2) a1=b1 and a2 < b2
这就是 Cassandra 在内部基于列的聚类进行排序的方式
基于此,查询1和查询2的结果符合预期。
我正在尝试了解具有聚类键的元组运算符的行为。这是我试图做的事情:
create table sampletable (a int,b int,c int, d int, e int, primary key((a,b,c),d,e));
insert into sampletable(a,b,c,d,e) values(1,1,1,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,1,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,1,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,2,2,3);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,1,2,3);
cqlsh:mapro> select * from sampletable;
a | b | c | d | e
---+---+---+---+---
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 2
1 | 1 | 1 | 2 | 3
1 | 1 | 2 | 1 | 1
1 | 1 | 2 | 1 | 2
1 | 1 | 2 | 2 | 3
(6 rows)
-- Query1
cqlsh:mapro> select * from sampletable where a=1 and b=1 and c in (1,2) and (d,e)<(2,3);
a | b | c | d | e
---+---+---+---+---
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 2
1 | 1 | 2 | 1 | 1
1 | 1 | 2 | 1 | 2
(4 rows)
-- Query2
cqlsh:mapro> select * from sampletable where a=1 and b=1 and c in (1,2) and (d,e)<(2,9);
a | b | c | d | e
---+---+---+---+---
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 2
1 | 1 | 1 | 2 | 3
1 | 1 | 2 | 1 | 1
1 | 1 | 2 | 1 | 2
1 | 1 | 2 | 2 | 3
(6 rows)
我无法理解为什么查询 2 返回的结果与查询 1 不同。我的理解是 Cassandra 将首先应用所有分区键过滤,然后尝试应用元组排序,即 (d,e) <(2,3) 将作为 d<2 应用,并且在结果之上它将应用 e<3。我的理解错了吗?请帮忙。
在对列进行聚类的情况下,(a1, a2) < (b1, b2)
可以满足以下任何一种情况:
1) a1 < b1
2) a1=b1 and a2 < b2
这就是 Cassandra 在内部基于列的聚类进行排序的方式
基于此,查询1和查询2的结果符合预期。