Cassandra CQL更新与对象映射器更新,这将对读取性能产生影响



让我们考虑下面的表格,实际上让我们假设该表具有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';

理解:

  1. 更新后,在Cassandra读取记录后,读取操作检查每一列以找出哪个是最新基于这些列的时间戳。

  2. 如果使用对象映射器更新上述employee_by_number表,则Cassandra需要检查/比较所有17列以查找所有这些。

  3. 在另一种使用CQL仅更新4列的情况下更新,Cassandra需要检查/仅比较这4列以查找其中的最新内容。

问题:

  1. 我的理解正确吗?

  2. 哪个是更新的首选方法,使用CQL Update设置4个字段或使用对象映射器更新所有列,即使 只有4个字段正在修改?

  3. 如果两个更新都不错并且不影响性能,是否有任何场景,我们不应该使用对象映射器进行更新?

  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所取代。

最新更新