2012-01-09 96 views
8

我試圖爲我的測試創建一些用戶。我使用cassandra-cql gem爲Ruby on Rails創建了一個從0到100000的循環中的用戶,然後我統計了數據庫中的用戶,結果只有10000個用戶。如果我創建9000,一切工作正常。首先,我認爲用戶不存在,但我使用Apollo WebUI作爲Cassandra,並且我可以找到具有ID 100000和下面的用戶的用戶。爲什麼會發生?用cassandra-cql錯誤計數(*)

我知道我應該使用計數器列來提供我的應用程序中的用戶數量,但是我想知道這是我的錯誤還是失敗。

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 

回答

23

CQL操作限制了將返回給用戶的行數和列數。默認情況下,此限制爲10,000。由於count(*)操作實際上必須提取所有行以獲取計數,所以它也受到10,000行默認值的限制。你可以增加限制的查詢(雖然我不建議這樣做):

SELECT count(*) FROM users limit 20000; 

注意,這是一個昂貴的操作尤其是當你有很多行。對於任何中型或大型數據集,您應該預計此類查詢可能需要很長時間。如果可能的話,你應該將這個計數器非規範化爲一個計數器或其他一些不需要獲取列族中所有行的形式。

+1

謝謝你! – user934801 2012-01-10 22:13:14

+0

嗨,我可以問一下你正在使用哪種版本的cassandra?我面臨着一個相關的問題,'select count(*)'和'limit'似乎完全被忽略了:http://stackoverflow.com/questions/36174805/cassandra-cql-select-count-with-limit – light 2016-04-02 19:09:09

+0

This問題來自2012年1月,所以最可能的是Cassandra 1.0.X. CQL自那時以來一直在進行大修,現在語義完全不同。 – psanford 2016-04-02 23:27:37