为什么 ClickHouse 客户端返回多个表?

lip*_*mar 3 clickhouse

我对 Clickhouse 很陌生,我的第一次尝试似乎总是为 SELECT 生成这种输出:

:) select * from test

SELECT *
FROM test 

??s???????i??
? foo ? 123 ?
?????????????
??s???????i??
? bar ? 567 ?
?????????????
Run Code Online (Sandbox Code Playgroud)

我希望是这样的:

??s???????i??
? foo ? 123 ?
? bar ? 567 ?
?????????????
Run Code Online (Sandbox Code Playgroud)

为什么我得到单独的行?是表结构引起的吗?这是test表的结构:

CREATE TABLE test
(
    s String,
    i UInt64
) ENGINE = Memory
Run Code Online (Sandbox Code Playgroud)

Amo*_*mos 5

背景

ClickHouse 有一个矢量化查询执行引擎,这意味着在解释查询时,它会批量消费数据。批处理的定义与底层存储引擎密切相关。由于您使用的是Memory引擎,它会为每个插入制定批次(或将大插入拆分为单独的批次,并使用max_insert_block_size设置)。

回答

您在查询输出中获得单独的表行的原因如下:

  • 您已将两个块(两个INSERT语句)插入到测试表中,因此从中扫描会生成两个块。

  • 您使用的查询不包含任何合并块的阻塞运算符(分组依据、排序依据等)。所以生成的块一一返回。

  • 命令行客户端在收到块时立即打印块。