ここでの主な問題は、複合パーティション キーIN
の 2 つの部分で関係を使用しようとしていることです。 パーティションまたはクラスタリング キーの最後の部分でのみ操作できます。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)
追加の考え:
IN
同じクエリで、パーティションの最後の部分とクラスタリング キーの両方でリレーションを使用できることを知りませんでした。ということで、今日は勉強になりました!
IN
パーティション キーでの の使用はうまく機能しないことがわかっていることを警告せざるを得ません ( Is the IN Relationship in Cassandra bad for query? )。実際、複数行キーのクエリは、Cassandra のアンチパターンとして識別されています。
YEAROFJOINING
これについて考えれば考えるほど、 (の代わりに)でスライスクエリを実行すると、パフォーマンスが向上すると思いますIN
。したがって、検索したい年が順序どおりである場合、たとえば 2014 年以降の場合、より適切なクエリは次のように機能します。
aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION
WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL')
AND YEAROFJOINING >= 2014;
YEAROFJOINING
これは、ディスク上の並べ替え順序を利用する onのクラスタリング キーにより高速になります。