2

我试图了解ReplacingMergeTree引擎是如何工作的。

我用这样的引擎配置了下表。

┌─brand─┬─country─┬─id─────┬────updated─┬─version─┐ │ IM │ FR │ 1 │ 2017-09-29 │ 2 │ │ IM │ FR │ 2 │ 2017-09-29 │ 0 │ │ IM │ FR │ 3 │ 2017-09-29 │ 1 │ └───────┴─────────┴────────┴────────────┴─────────┘

此时一切正常。

然后我执行以下INSERT.

INSERT INTO table(brand, country, id, updated, version) VALUES ('IM', 'FR', 1, '2017-10-29', 3);

正如预期的那样,有 2 行 id 1

┌─brand─┬─country─┬─id─────┬────updated─┬─version─┐ │ IM │ FR │ 1 │ 2017-09-29 │ 2 │ │ IM │ FR │ 2 │ 2017-09-29 │ 0 │ │ IM │ FR │ 3 │ 2017-09-29 │ 1 │ └───────┴─────────┴────────┴────────────┴─────────┘ ┌─brand─┬─country─┬─id─────┬────updated─┬─version─┐ │ IM │ FR │ 1 │ 2017-10-29 │ 3 │ └───────┴─────────┴────────┴────────────┴─────────┘

由于该表的主键是(brand, country, id),因此我希望该表上的合并将替换具有较低版本 2 的 id=1 的行。

触发合并OPTIMIZE TABLE table以检查,似乎它没有以这种方式工作,并且两行都令人惊讶地保留了下来。

┌─brand─┬─country─┬─id─────┬────updated─┬─version─┐ │ IM │ FR │ 1 │ 2017-10-29 │ 3 │ └───────┴─────────┴────────┴────────────┴─────────┘ ┌─brand─┬─country─┬─id─────┬────updated─┬─version─┐ │ IM │ FR │ 1 │ 2017-09-29 │ 2 │ │ IM │ FR │ 2 │ 2017-09-29 │ 0 │ │ IM │ FR │ 3 │ 2017-09-29 │ 1 │ └───────┴─────────┴────────┴────────────┴─────────┘

4

1 回答 1

1

从逻辑上讲,它应该按照您的描述工作。可能是version列名的问题?如果在表定义期间没有指定它,它被称为_part_index

你能提供你的show create table吗?

ReplacingMergeTree 有测试https://github.com/yandex/ClickHouse/blob/012c5f1079e7a2605e872eb223b9c5dcd065880e/dbms/tests/queries/0_stateless/00325_replacing_merge_tree.sql.disabled

文档:https ://clickhouse.yandex/docs/en/table_engines/replacingmergetree.html

于 2017-10-03T15:52:50.403 回答