2017-04-19 58 views
1

document此列出了一些CQL限值卡桑德拉2.2。我在爲SetList的數據收集限制特別感興趣。如果我已經正確解釋它,文檔指出Sets中的值限制爲65535字節。CQL列表值是否真的限制爲65535字節?

據我所知,這個限制的存在是因爲集合標識是通過存儲引擎單元的列名稱中的複合值實現的(類似於集羣列值限制),CQL限制爲那麼多字節。

考慮一個表,其中的Set

CREATE TABLE test.bounds (
    someid text, 
    someorder text, 
    words set<text>, 
    PRIMARY KEY (someid, someorder) 
) 

PreparedStatement ps = session.prepare("INSERT INTO test.bounds (someid, someorder, words) VALUES (?, ?, ?)"); 
BoundStatement bs = ps.bind("id", "order", ImmutableSet.of(StringUtils.repeat('a', 66000))); 
session.execute(bs); 

這將拋出預期的異常

Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (66024 > 65535) 

現在,如果我更改表使用List而不是Set

CREATE TABLE test.bounds (
    someid text, 
    someorder text, 
    words list<text>, 
    PRIMARY KEY (someid, someorder) 
) 

,並使用

BoundStatement bs = ps.bind("id", "order", ImmutableList.of(StringUtils.repeat('a', 66000))); 

我沒有收到異常。 該文件,然而,指出List值大小也侷限於65535個字節。文檔不正確還是我誤解了?

我假定List值被實現爲基礎存儲簡單的列值和順序通過它們的時間戳保持。

回答

5

這裏的文件是錯誤的,因爲據我瞭解它。協議版本3(在C * 2.1中引入)中更改了此限制。從native protocol specification下的變化部分用於協議3:

  • 收集的序列化格式已改變(二者集合大小和 每個參數的長度是現在4個字節長)。請參閱第6

所以只要使用協議版本3或更高,可以用多達2^31-1字節(2147483647)或元素創建列表。

編輯:我剛纔注意到你關於設置身份的意見,這可能是存儲引擎本身的限制,所以也許文檔被留下這樣的原因,但協議本身現在支持大集合。如果我們能記錄那個細微差別,我們會追求看。