文档中心>腾讯云数据仓库 TCHouse-C>实践教程>腾讯云数据仓库 TCHouse-C 数据实时更新使用指引

腾讯云数据仓库 TCHouse-C 数据实时更新使用指引

最近更新时间:2024-08-26 10:23:01

我的收藏

功能介绍

腾讯云数据仓库 TCHouse-C 支持数据实时更新功能,即支持完整 UPSERT 语义。当使用 UPSERT 功能时,数据更新和删除时同步生效。
注意:
此功能为腾讯云数据仓库 TCHouse-C 新功能,如有需要,请联系在线客服咨询使用。

适用场景

腾讯云数据仓库 TCHouse-C 的数据实时更新是同步生效的,具体适用场景为:
对于某些满足条件的行,修改 1 个或者多个字段的值(排序键,分区键以及唯一键不可修改)。
点更新或删除,通过 WHERE 条件将更新或者删除的数据限制在较少的行。
UPSERT 功能只在具有 UNIQUE KEY 定义的 MergeTree/ReplicatedMerge 表引擎中支持。其他类似于 replacingMergeTree 或者VersionedCollapsingMergeTree 则不支持备份。

性能

UPSERT 的性能与待更新数据的行数量、待更新数据跨分区分布情况以及数据过滤条件相关。具体而言:
单次更新动作中,待更新数据行数越小,更新代价越小;
单次更新动作中,待更新数据所属分区数量越少(最好是都属于同一个分区),更新代价越小;
单次更新中,数据过滤( WHERE 条件)执行代价越小,更新代价越小。(通常建议 WHERE 条件包含排序键字段)。

使用注意事项

相比开源 ClickHouse,在使用实时更新功能时,需要考虑其特殊性。

避免并发更新相同的 UNIQUE KEY

腾讯云数据仓库 TCHouse-C 使用的是 Merge-On-Write 实现数据按行更新。在一次更新动作中,包含了数据读取和数据写入两个步骤。如果同时对相同的 UNIQUE KEY 进行并发更新操作,会存在结果不确定性问题。
针对该问题,在后续版本中,会引入用户自定义版本字段来在业务层面解决数据冲突问题。

需要使用更多内存资源

腾讯云数据仓库 TCHouse-C 为了实现数据唯一性,使用了 HASH 索引,需要占用一定量的内存。对于 20 亿行的数据,以 UInt64 字段作为 key,占用内存在 70GB 左右, 尽量使用高内存机型,不然如果因为数据太多导致内存耗尽,可能存在无法启动的风险。

避免大批量更新

腾讯云数据仓库 TCHouse-C 通过 Merge-On-Write 实现数据更新,大批量更新会放大数据写入节点的延迟。业务层面尽可能采取小批量更新,例如点更新。

UNIQUE KEY 数据唯一性约束只在节点内有效

腾讯云数据仓库 TCHouse-C 在节点内部维护了索引,确保 UNIQUE KEY 唯一性。若相同数据分布在不同节点,集群无法确保其唯一性。业务层面需要将相同的 KEY 写到同一个 SHARD。 谨慎进行水平扩容, 水平扩容后会改变节点 key 映射关系。

避免单 SQL 执行多分区更新

为了避免系统中存在过的小文件,以及降低更新代价,建议单个 SQL 只执行一个分区中的数据更新。

操作步骤

创建表

如下示例:
CREATE TABLE IF NOT EXISTS realtime_insert(
id UInt32,
value1 UInt32,
value2 UInt32
) ENGINE = MergeTree()
UNIQUE KEY id
ORDER BY id;
UNIQUE KEY 定义表示该表将会被创建为 upsert MergeTree 类型表,id 则表示唯一键,用于表数据生成唯一索引,以及数据去重。 如果不填写 UNIQUE KEY 定义,则表示该表没有 upsert 特性,和普通 MergeTree 表没有区别。
注意:
UNIQUE KEY 选定唯一键推荐仅使用1个字段,选取多个字段作为唯一键内存消耗更多。
UNIQUE KEY 选定的唯一键必须是 ORDER BY 或者 PRIMARY KEY 选取 column 集合的第一个 column,或者前缀集合。
UNIQUE KEY 支持的 column 类型仅为 Int8/16/32/64/128, UInt8/16/32/64/128, UUID, IPV4, String 其余类型的 column 不能作为 UNIQUE KEY, 并且 column 类型不能是 Nullable,也不能是表达式。
指定 UNIQUE KEY 的表不支持 projection 特性。
指定 UNIQUE KEY 的表,Engine 仅支持 MergeTree 和 ReplicatedMergeTree(beta),其余 Engine 类型不支持。
指定了 UNIQUE KEY 的 ReplicatedMergeTree 表不支持 ttl 特性, 也不支持 drop part 和 drop partition。
指定 UNIQUE KEY 的表不能对表进行 column 的操作,例如增加新列,删除旧列,更改列类型,删除列。

INSERT INTO 实时更新

指定了 UNIQUE KEY 的表,支持写入时实时去重:
insert into realtime_insert values (1,2,2);
insert into realtime_insert values (1,3,3);

9.0.16.14 :) select * from realtime_insert;
SELECT *
FROM realtime_insert

Query id: e19c1105-9b13-4d4f-810d-596bc9cfb62b
┌─id─┬─value1─┬─value2─┐
133
└────┴────────┴────────┘
如果两次写入的数据对应的 UNIQUE KEY 字段数值一致,那么后写入数据会覆盖前一次的数据,保证数据的最终去重。

UPSERT 实时更新

指定了 UNIQUE KEY 的表,支持 update 语句用于更新表中的数据。 语法:
update [db.]table set column1 = expr1 [, ...] WHERE filter_expr
如下是示例:
insert into realtime_insert values (1,3,3);
update realtime_insert set value1 = 4 where id = 1;
9.0.16.14 :) select * from realtime_insert;

SELECT *
FROM realtime_insert

Query id: 3972121e-6474-44ee-bd48-5168d2e54c74

┌─id─┬─value1─┬─value2─┐
143
└────┴────────┴────────┘
注意:
update 语法不能更新 UNIQUE KEY 或者 PRIMARY KEY 选定的字段。
更新大量数据会消耗较多的性能,执行时间也较长。

DELETE 实时删除

指定了 UNIQUE KEY 的表,支持 DELETE 语句用于删除中的数据。 语法:
delete [db.]table WHERE filter_expr
以下是示例:
insert into realtime_insert values (1,3,3);
insert into realtime_insert values (2,3,3);
delete from realtime_insert where id = 1;

9.0.16.14 :) select * from realtime_insert;

SELECT *
FROM realtime_insert

Query id: 107c7db9-072f-4295-a63d-2a8912cde1e1

┌─id─┬─value1─┬─value2─┐
233
└────┴────────┴────────┘
注意:
删除大量数据会消耗较多的性能,执行时间也较长。