我们有一个frozen UDT
,其中~2000
字段是表中的列之一,我们使用这个表来实现只添加写入,这样数据是可审计的,而不是被覆盖的。
当UDT
中只有1个字段(共2000个)被填充时,我们看到写入性能下降。
试图理解使用稀疏填充的冻结UDT的性能含义。UDT serialized/deserialized
内部如何?任何有关此问题的文档都将受到高度赞赏。
我们试图从cass会话中收集一些指标,但无法获得太多信息。
编辑:将C++
cassandra驱动程序与Prepared Statements
一起用于写入
cassandra 版本:3.11.6
数据模型:
CREATE TYPE udt_xyx {
field1 bigint,
field2 ..
..
..
field2000
}
CREATE TABLE table_xyz(
key_1 text,
txn_id int,
fields frozen<udt_xyx>,
PRIMARY KEY ((key_1), txn_id)
)
工作流程:
1.请求来自调用方,用于为给定的key_1
写入n
字段(来自2000
)。
1.我们为请求分配一个唯一的txn_id
(transaction_id)。
1.然后,我们创建一个UDT
对象,该对象具有2000
字段,但只填充这些字段中的n
,并将其持久化在表中。
1.对于具有不同(或相同)字段的相同key_1
的新请求,将被分配一个新的txn_id
,并作为新记录写入表中。
这样我们就不会更新任何当前写入的UDT
,而是总是在表中创建一个新记录(与新的txn_id
相关联)。
当UDT
的填充稀疏时,我们会遇到写入性能下降的问题。
- 编辑:在进行了一些分析之后,我们将速度缓慢的原因缩小到以下几点:**https://www.example.comgithub.com/datastax/cpp-driver/blob/master/src/data_type.hpp#L352-L380
基本上,每次绑定UDT时,"check"方法都会运行,并比较UDT中每个字段的字符串名称。
因为我们有大约2000个字段,并且我们执行了超过100,000次绑定,所以我们执行了大约1亿次字符串比较
1条答案
按热度按时间ars1skjm1#
您在这里度量的是什么性能?比较使用非UDT列向表中插入数据与同时使用非UDT列和UDT类型列插入数据的性能?
类型为 frozen 集合(集合、Map或列表)或UDT的列只能将其值作为一个整体替换。换句话说,我们不能像在非frozen集合类型中那样添加、更新或删除集合中的单个元素。因此,frozen关键字可能很有用,例如,当我们希望保护集合不受单值更新时。
例如,在以下片段的情况下,
嵌套在列表中的UDT被冻结,因此当查询表时将读取整个列表。
由于您没有提供更新冻结集合的“方式”,因此很难判断为什么会出现性能问题。
勘探参考资料:
本质上,您将无法对冻结的类型执行 append-only 操作,因为您必须始终对任何upsert执行先读后写操作。