2017-09-17 7 views
0

私はCassandraを使用してフルレンジのクエリを実行し、thisの記事に基づいてトークンの使用に関する不確実性を明確にする方法を理解しようとしています。Cassandra - WHERE句の範囲/トークンの照合

私は、次の表を持っていることを言うことができます:

CREATE TABLE space.rocket (
    id timeuuid, 
    group text, 
    priority smallint, 
    date text, // Will hold YYYY-MM-DD 
    PRIMARY KEY ((group , date) , priority, id)); 

範囲where句を持っている最良のオプションは何ですか?例えば


私はこのように、グループ、日付と優​​先順位の範囲を実行することができます。

SELECT * FROM space.rocket 
    WHERE token(group, date) => token('group-name', '2017-17-09') 
    AND token(group, date) < token('group-name', '2017-17-10') 
    AND priority >= (0) AND priority <= (10) # or priority IN (0,1,2...10) 

または私はこのように、トークンを使用する必要があります。

SELECT * FROM space.rocket 
    WHERE token(group, date, priority) => token('group-name', '2017-17-09', 0) 
    AND token(group, date, priority) < token('group-name', '2017-17-10', 11) 

また、セカンダリインデックス(id)の範囲も含むクエリについては、次のようになります。

SELECT * FROM space.rocket 
    WHERE token(group, date, priority, id) => token('group-name', '2017-17-09', 0, timeuuidStart) 
    AND token(group, date, priority, id) < token('group-name', '2017-17-10', 11, timeuuidFinish) 

または、グループのリストと日付の範囲を照会するにはどうすればよいですか?


、 感謝を教えてください!

答えて

1

あなただけ、あなたの場合は

キーパーティション上のトークン範囲クエリを実行する必要があり、パーティション・キーは"(group , date)"です。したがって、最初のクエリだけが正しいです。

SELECT * FROM space.rocket 
    WHERE token(group, date) => token('group-name', '2017-17-09') 
    AND token(group, date) < token('group-name', '2017-17-10') 
    AND priority >= (0) AND priority <= (10) # or priority IN (0,1,2...10) 

注:ByteOrderedPartitioner使用している場合にのみ、あなたは意味のある結果(2017-17-09と2017-17-10の間でのデータ)を取得します。それにもかかわらず、注意する必要があります。それはアンバランスなクラスタになりますようByteOrderedPartitionerを使用することは推奨されません

詳しい情報:https://docs.datastax.com/en/cql/3.3/cql/cql_using/useToken.html

+0

もし私がByteOrderedPartitionerを使用していないなら、結果はどうですか? クエリは正しい順序で間違った正しい結果を返すでしょうか?パフォーマンスの影響がありますか?ありがとう! – eldad87

+0

ByteOrderedPartitionerを使用しておらず、クエリの意味が少ない場合、2017-17-09と2017-17-10の間のデータは取得されません。日付範囲外の日付のトークンは日付の範囲トークンの内側にある可能性があります。 –

0

したいデータの範囲をフェッチするための最良の方法があること、各パーティション・キーの非同期クエリを発射するだろうアプリケーション側で結果をマージする必要があります。

クラスタリング・カラムでIN関係またはスライス関係を使用しても大きな違いはありません。