Clickhouse:在 select 上拆分输出

Clickhouse: split output on select

在通过实体化视图从 KafkaEngine table 加载的 MergeTree table 上对 Clickhouse 执行 select,一个简单的 select 显示输出拆分clickhouse-client 中的组:

:) select * from customersVisitors;
SELECT * FROM customersVisitors 

┌────────day─┬─────────createdAt───┬──────────────────_id─┬───────────mSId─┬───────xId──┬─yId─┐
│ 2018-08-17 │ 2018-08-17 11:42:04 │  8761310857292948227 │ DV-1811114459  │ 846817     │ 0   │
│ 2018-08-17 │ 2018-08-17 11:42:04 │ 11444873433837702032 │ DV-2164132903  │ 780066     │ 0   │
└────────────┴─────────────────────┴──────────────────────┴────────────────┴────────────┴─────┘
┌────────day─┬─────────createdAt───┬──────────────────_id─┬───────────────────mSId──┬────────xId─┬─yId─┐
│ 2018-08-17 │ 2018-08-17 10:25:11 │ 14403835623731794748 │ DV-07680633204819271839 │ 307597     │ 0   │
└────────────┴─────────────────────┴──────────────────────┴─────────────────────────┴────────────┴─────┘

3 rows in set. Elapsed: 0.013 sec. 

引擎是ENGINE = MergeTree(day, (mSId, xId, day), 8192)

为什么输出分成两组?

如果我没记错的话,当数据来自不同的块时,输出会被拆分,而且通常会导致在不同的线程中处理。如果您想摆脱它,请将查询包装在外部 select

select * from (...)

MergeTree Engine 专为更快的写入和读取操作而设计。

更快的写入是通过分块插入数据,然后将数据离线合并为单个部分以实现更快的读取。

可以在以下目录看到数据分区:

 ls /var/lib/clickhouse/data/database_name/table_name

如果您 运行 以下查询,您会发现数据现在在单个组中可用,并且在上述位置也有一个新分区可用:

optimize table MY_TABLE_NAME

优化 table 强制合并分区,但一般情况下,您可以将其保留在 Click house 上。