此document列出了Cassandra 2.2的许多CQL限制。我对Set
和List
的收藏限制特别感兴趣。如果我已正确解释它,则文档指出集合中的值限制为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
值是作为基础存储中的简单列值实现的,并且订单是通过其时间戳维护的。
答案 0 :(得分:6)
据我所知,这里的文档是错误的。协议版本3(在C * 2.1中引入)中更改了该限制。从协议3的更改部分下的native protocol specification:
- 收集的序列化格式已更改(收集大小和 每个参数的长度现在是4个字节长)。见第6节。
因此,只要您使用协议版本3或更高版本,就可以创建多达2 ^ 31-1个字节(2147483647)或元素的列表。
编辑:我刚刚注意到你对集合身份的评论,这可能是存储引擎本身的限制,因此文档可能因此而保留,但协议本身现在支持更大的集合。如果我们能记录这种细微差别,我们会继续寻找。