2017-09-17 1 views
0

Ich versuche zu verstehen, wie eine vollständige Palette Abfragen mit Cassandra durchzuführen und um einige Unsicherheit in Bezug auf Token-Nutzung basierend auf Artikel this zu klären.Cassandra - WHERE Klausel Bereich/Token Klerifizierungen

Lassen Sie uns sagen, dass ich in der folgenden Tabelle haben:

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

Was ist die beste Option, um einen Bereich zu haben, wo Klausel?


Zum Beispiel:

Kann ich eine Reihe von Gruppen, Datum und Priorität, wie dies auszuführen:

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) 

Oder sollte ich ein Token verwenden, wie folgt aus:

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) 

Und wie wäre es mit einer Abfrage, die auch einen Bereich auf sekundären Index (ID), wie folgt enthält:

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) 

Oder, wie nach einer Liste von Gruppen und einem Bereich von Daten abfragen?


Bitte raten, Dank!

Antwort

1

Sie sollten nur Token Bereich Abfrage durchführen nur auf Partitionsschlüssel

In Ihrem Fall ist Partition Schlüssel "(group , date)". Also nur deine erste Anfrage ist korrekt.

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) 

Hinweis: Wenn Sie ByteOrderedPartitioner verwenden nur dann werden Sie sinnvolles Ergebnis (Daten zwischen 2017-17-09 und 2017-17-10) erhalten. Sie sollten dennoch vorsichtig sein. einen ByteOrderedPartitioner wird nicht empfohlen, da es Erfahren Sie mehr in unausgeglichen Cluster

zur Folge haben kann: https://docs.datastax.com/en/cql/3.3/cql/cql_using/useToken.html

+0

Wenn ich ** NOT ** mit ByteOrderedPartitioner bin, was sind die Folgen? Die Abfrage wird korrekt korrekte Ergebnisse (von wo Bedingungen) nur mit falscher Reihenfolge zurückgeben? oder wird es Auswirkungen auf die Leistung haben? Bitte beraten, Danke! – eldad87

+0

Wenn Sie ByteOrderedPartitioner nicht verwenden, bedeutet Ihre Abfrage weniger, Sie erhalten keine Daten zwischen 2017-17-09 und 2017-17-10. Da ein Token eines Datums außerhalb des Datumsbereichs möglicherweise innerhalb des Bereichstokens des Datums liegt und umgekehrt. –

0

Der beste Weg, den Bereich der Daten zu holen, die Sie würden wollen eine asynchrone Abfrage für jede Partition Schlüssel zum Feuer, das Sie möchten und die Ergebnisse auf Ihrer Anwendungsseite zusammenführen.

Die Verwendung einer IN- oder einer Slice-Beziehung in einer Clusterspalte macht keinen großen Unterschied.