cassandra 稀疏填充的冻结用户定义类型对性能有何影响?

ktecyv1j  于 2023-02-04  发布在  Cassandra
关注(0)|答案(1)|浏览(127)

我们有一个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亿次字符串比较

ars1skjm

ars1skjm1#

您在这里度量的是什么性能?比较使用非UDT列向表中插入数据与同时使用非UDT列和UDT类型列插入数据的性能?
类型为 frozen 集合(集合、Map或列表)或UDT的列只能将其值作为一个整体替换。换句话说,我们不能像在非frozen集合类型中那样添加、更新或删除集合中的单个元素。因此,frozen关键字可能很有用,例如,当我们希望保护集合不受单值更新时。
例如,在以下片段的情况下,

CREATE TYPE IF NOT EXISTS race (
race_title text,
race_date date
);

CREATE TABLE IF NOT EXISTS race_data (
id INT PRIMARY KEY,
races frozen<list<race>>
...
);

嵌套在列表中的UDT被冻结,因此当查询表时将读取整个列表。
由于您没有提供更新冻结集合的“方式”,因此很难判断为什么会出现性能问题。

勘探参考资料

本质上,您将无法对冻结的类型执行 append-only 操作,因为您必须始终对任何upsert执行先读后写操作。

相关问题