让我们考虑下面的表格,实际上让我们假设该表具有40 列
CREATE TABLE IF NOT EXISTS employee_by_id (
employee_id text,
first_name text,
middle_name text,
last_name text,
date_of_birth date,
joining_date date,
role_id text,
role_name text,
dept_id text,
dept_name text,
reporting_manager_id text,
reporting_manager_name text,
created_on timestamp,
created_by text,
updated_on timestamp,
updated_by text,
status text
PRIMARY KEY (employee_id)
);
有一个方案可以更新部门详细信息,列DEPT_ID和 dept_name。
有两种方法可以完成此更新,
1。Cassandra对象映射器
假设对象映射器在整个对象上工作,它会更新所有 列,包括未修改的列 场景。
2。CQL UPDATE查询
UPDATE employee_by_id set
dept_id = 'A100',
dept_name = 'General Accounts',
updated_on = '2017-04-24T00:00:00.000Z',
updated_by = 'arun'
WHERE
employee_id = 'E04500';
理解:
更新后,在Cassandra读取记录后,读取操作检查每一列以找出哪个是最新基于这些列的时间戳。
如果使用对象映射器更新上述employee_by_number表,则Cassandra需要检查/比较所有17列以查找所有这些。
在另一种使用CQL仅更新4列的情况下更新,Cassandra需要检查/仅比较这4列以查找其中的最新内容。
问题:
我的理解正确吗?
哪个是更新的首选方法,使用CQL Update设置4个字段或使用对象映射器更新所有列,即使 只有4个字段正在修改?
如果两个更新都不错并且不影响性能,是否有任何场景,我们不应该使用对象映射器进行更新?
cql Update vs Object Mapper更新,当仅在几列上完成更新时,它将对读取性能产生影响。
使用cql query
如果您可以使用CQL查询插入/更新,最好。但是您必须为更新的每种组合手动编写查询代码。
使用对象映射
您不必为插入/更新的每种组合编写查询。对象映射器会自动考虑这一点。
但请记住
将数据保存到Cassandra时,默认情况下,Cassandra Object mapper保存在表实体中声明的所有字段。
如果您没有设置字段值,则默认值为null,除了原始字段。因此,将用对象映射器插入零值,将产生墓碑。墓碑占用空间,可以大大增加您所需的存储量。用大量墓碑的标准桌子会导致性能问题,并导致延迟和堆压。
阅读有关墓碑的更多信息:https://opencredo.com/cassandra-tombstones-common-issues/
顺便说一下,您可以更改映射器默认保存选项:
mapper.setDefaultSaveOption(saveNullFields(false));
插入时会忽略零值字段。
对象映射器的另一个问题,假设您已声明了一些具有原始类型的字段。如果您没有设置这些字段,则将使用默认值0(原始类型默认值为0(。
现在您首次设置了这些值,例如比0。因此,对象映射器保存这些值。之后,您尚未指定这些值,因此您的值将被默认值0所取代。