2012-01-09 10 views
8

Ho provato a creare alcuni utenti per i miei test. Ho creato utenti in un ciclo da 0..1000 utilizzando la gemma cassandra-cql per Ruby on Rails, quindi ho contato gli utenti nel mio database e ne risultavano solo 10000 utenti. Se creo 9000, tutto funziona correttamente. Innanzitutto pensavo che gli utenti non esistessero, ma ho usato Apollo WebUI per Cassandra, e ho potuto trovare l'utente con l'id 100000 e gli utenti di seguito. Perché succede?Conteggio errato (*) con cassandra-cql

So che dovrei usare una colonna contatore per fornire il numero di utenti nella mia applicazione, ma voglio sapere se questo è un bug o un mio errore.

def self.create_users 
    (0..19000).each do |f| 
    @@db.execute("INSERT INTO users (uid, first_name, last_name, email) VALUES (?,?,?,?)", f.to_s, "first_name", "last_name", "email") 
    end 
end 

def self.count_users 
    count = @@db.execute("SELECT count(*) FROM users") 
    count.fetch do |c| 
    return c[0] 
    end 
end 

risposta

23

Le operazioni CQL limitano il numero di righe e il numero di colonne che verranno restituite all'utente. Di default il limite è 10.000. Poiché l'operazione count (*) deve effettivamente recuperare tutte le righe per ottenere il conteggio, è anche limitata dal valore predefinito di 10.000 righe. Si potrebbe aumentare il limite per la query (anche se io non lo consiglio):

SELECT count(*) FROM users limit 20000; 

Si noti che questa è un'operazione costosa, soprattutto quando si hanno un sacco di righe. È necessario prevedere che questo tipo di query potrebbe richiedere molto tempo per qualsiasi set di dati di medie o grandi dimensioni. Se possibile, dovresti denormalizzare questo conteggio in un contatore o in un altro modulo che non richiederà il recupero di tutte le righe della famiglia di colonne.

+1

grazie per quello! – user934801

+0

Ciao, posso solo chiedere quale versione di cassandra stai usando? Sto affrontando un problema correlato con 'select count (*)' e 'limite' sembra essere completamente ignorato: http://stackoverflow.com/questions/36174805/cassandra-cql-select-count-with-limit – light

+0

Questo la domanda era da gennaio 2012, quindi era molto probabile che Cassandra 1.0.X. CQL è stato revisionato da allora e ora ha una semantica completamente diversa. – psanford

Problemi correlati