-1

在此表中,los.configuration 的分区键由 3 列组成(1. groupname 2. class 3.yearofjoining)。可能有 2 类 BPL 和 APL。我想从数据库中选择这两个类别。

所以我必须使用查询:

SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 
AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015);

当我尝试此查询时,它返回一个错误

Partition KEY part class不能被IN关系限制(只有partition key的最后一部分可以)。

知道问题是什么吗?

4

1 回答 1

1

这里的主要问题是您试图在复合分区键IN的两个部分上使用关系。 只能对分区或集群键的最后一部分进行操作。IN

为了让您的查询正常工作,您的 PRIMARY KEY 需要在GROUPNAME和上进行分区CLASS,同时在 上进行集群YEAROFJOINING

PRIMARY KEY ((groupname, class), yearofjoining))

当我使用该 PRIMARY KEY 查询您的表时,使用您的原始查询:

aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION 
    WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') 
    AND YEAROFJOINING IN (2014,2015);

 groupname | class | yearofjoining | value
-----------+-------+---------------+-------
       332 |   APL |          2014 | test1
       332 |   APL |          2015 | test3
       332 |   BPL |          2014 | test2

(3 rows)

额外的想法:

  1. 我不知道您可以IN在同一查询中对分区的最后部分和集群键使用关系。所以我今天学到了一些东西!

  2. 我不得不警告您,IN已知在您的分区键上使用的性能不佳(Cassandra 中的 IN 关系是否不利于查询?)。事实上,多行键查询已被确定为 Cassandra 反模式。

  3. 我越想这个,我越认为如果你对YEAROFJOINING(而不是IN)进行切片查询,你会获得更好的性能。因此,如果您要搜索的年份是有序的,比如 2014 年及更高版本,则更好的查询将像这样工作:

    aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;

由于集群键 on YEAROFJOINING,这将更快,这将利用您的磁盘排序顺序。

于 2015-03-20T11:11:10.930 回答