我正在使用 ClickHouse 来构建“一种可更新的大型(数亿行)表”,并带有
ReplacingMergeTree
。我需要批量更新插入并进行一些非聚合选择。效果很好。
尽管它有点像黑客,而且远非最佳(我的意思是与 OLAP 的 Clickhouse 不同),但它可以很好地扩展,并且仍然比或多或少专门用于此目的的系统(如 HBase 或 RDBM)(满足我的需要)执行得更快。
我使用带钥匙的
ReplacingMergeTree
桌子:
CREATE TABLE Things (Key Int32, ValueA Int32, ValueB Int32)
ENGINE = ReplacingMergeTree() ORDER BY Key
我更新插入:
INSERT INTO Things (Key,ValueA,ValueB) ...
并使用“
FINAL
”修饰符进行选择:
SELECT Key,ValueA,ValueB FROM Things FINAL WHERE ...
我可以使用名为“Killed”的列“删除”对象。但有时,我需要清理“杀死”的对象,以防止表无休止地增长。
我发现的唯一方法是重新创建一个新表并在其中插入未杀死的行。 有更聪明的方法吗?
ClickHouse 在最近的版本中支持
DML
操作,因此您不需要 ReplacingMergeTree
那样的逻辑删除记录。
查看 https://clickhouse.yandex/docs/en/query_language/alter/#mutations 了解更多详细信息。
您可以在有条件的表上使用 TTL。只需确保忽略查询中已删除的条目即可。
CREATE TABLE ....
(
.
.
is_deleted UInt8
) ENGINE = AggregatingMergeTree
ORDER BY (...)
TTL if(is_deleted == 1, now(), toDateTime('2106-02-07'));