【问题标题】:Cassandra CQL update vs Object Mapper update, which will have an impact on read performanceCassandra CQL 更新 vs Object Mapper 更新,这将对读取性能产生影响
【发布时间】:2017-09-21 18:50:13
【问题描述】:

假设我们有下表,实际上假设该表有 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 和 部门名称。

有两种方法可以完成此更新,

1. Cassandra 对象映射器

假设对象映射器适用于整个对象,它会更新所有 包括上述未修改的列 场景。

2。 CQL 更新查询

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 更新设置 4 个字段或使用对象映射器更新所有列,即使 只修改了 4 个字段?

  3. 如果两个更新都很好并且不影响性能,是否存在不应该使用对象映射器进行更新的场景?

  4. CQL 更新与 Object Mapper 更新,当仅对少数列进行更新时,这将对读取性能产生影响。

【问题讨论】:

    标签: cassandra cql3


    【解决方案1】:

    使用 CQL 查询

    如果您可以使用 CQL 查询插入/更新,那是最好的。但是你必须为每个更新的组合手动编写查询代码。

    使用对象映射器

    您不必为每个插入/更新组合编写查询。对象映射器会自动处理这一点。

    但请记住

    在将数据保存到 Cassandra 时,默认情况下 Cassandra Object Mapper 会保存表实体中声明的所有字段。

    如果您没有设置字段值,则默认值为 null,原始字段除外。因此,空值将通过 Object Mapper 插入到 cassandra,从而生成墓碑。 Tombstone 占用空间并且可以大大增加您需要的存储量。查询具有大量 tombstone 的表会导致性能问题,并且会导致延迟和堆压力。

    阅读更多关于墓碑的信息:https://opencredo.com/cassandra-tombstones-common-issues/

    顺便说一句,您可以更改映射器默认保存选项:

    mapper.setDefaultSaveOption(saveNullFields(false));
    

    插入时会忽略空值字段。

    Object Mapper 的另一个问题,假设您声明了一些具有原始类型的字段。如果您没有设置这些字段,将使用默认值 0(原始类型默认值为 0)。

    现在您第一次设置了这些值,假设大于 0。所以 Object Mapper 保存这些值。之后你没有指定这些值,所以你的值将被默认值 0 替换。

    【讨论】:

    • 我的问题不是关于设置空值,而是关于存储或设置相同的值到一列。换句话说,它是关于更新具有相同值的字段及其影响。您能否阅读问题并适当更新您的答案?
    • @ArunBC CQL 查询最好使用,但如果您使用对象映射器,对象映射器如何假设知道哪个字段已更新?我刚刚证明了
    • 你能回答我帖子底部的 4 个问题吗?这是关于使用 CQL 进行部分更新与使用对象映射器进行完全更新时的读取性能。如果你认为你已经回答了,不用担心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2014-01-02
    • 2015-11-09
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多