2016-10-24 1 views
2

J'ai une machine de dev avec Cassandra 3.9 et 2 tables, l'un a ~~ 400 000 enregistrements, un autre environ 40 000 000 enregistrements. Leurs structures sont différentes.Cassandra lente SELECT MAX (x) requête

Chacun d'entre eux a un index secondaire sur un champ x, et j'essaye d'exécuter une requête du formulaire SELECT MAX(x) FROM table. Sur la première table, la requête prend quelques secondes, et sur la deuxième table, elle expire.

Mon expérience est avec des bases de données relationnelles où ces requêtes sont triviales et rapides. Donc, dans Cassandra, il semble que l'index n'est pas utilisé pour exécuter ces requêtes? Y a-t-il une alternative?

Répondre

5

Dans les fonctions d'agrégation de cassandra tels que MIN, MAX, COUNT, SUM ou AVG sur une table sans specifing une clé de partition est une mauvaise pratique. à la place, vous pouvez avoir une autre table qui stocke la valeur maximale du champ x pour les deux tables.

Toutefois, vous devez ajouter une logique côté client pour conserver cette valeur maximale dans l'autre table lorsque vous exécutez les instructions INSERT ou UPDATE.

structures Tableaux:

CREATE TABLE t1 (
    pk text PRIMARY KEY, 
    x int 
); 

CREATE TABLE t2 (
    pk text PRIMARY KEY, 
    x int 
); 

CREATE TABLE agg_table (
    table_name text PRIMARY KEY, 
    max_value int 
); 

Donc, avec cette structure, vous pouvez avoir la valeur maximale pour une table:

SELECT max_value 
FROM agg_table 
WHERE table_name = 't1'; 

espère que cela peut vous aider.

+0

Dois-je oublier les transactions et l'atomicité avec Cassandra? :) –

+0

Cassandra ne supporte pas les transactions, elle garantit simplement l'atomicité au niveau des lignes. Par exemple, si vous exécutez quelques mises à jour, si toutes les opérations précédentes échouent, elles seront écrites sans possibilité de restauration. –