https://inasa.dev/blog/rss.xml

ClickHouse | 为什么select的输出会倍拆分

2023-08-13

控制台输出这样的时候,很疑惑

:) select * from test

SELECT *
FROM test 

┌─s───┬───i─┐
│ foo │ 123 │
└─────┴─────┘
┌─s───┬───i─┐
│ bar │ 567 │
└─────┴─────┘

更快的写入是通过将数据写入多个分区来实现的,然后将数据离线合并到单个分区中以实现更快的读取

写入时会根据每次写入的批次或 max_insert_block_size (将大型写入拆分为单独的批次)

  • 每次写入的批次
    • 默认一条insert插入的数据为同一个数据分区,不同insert插入的数据为不同的分区

查询数据时往往是多线程查询,所有输入数据来自不同的分区,会由不同的线程的处理,命令行客户端在收到后立即打印

如果使用的查询不包含任何合并块的阻塞运算符(group by、order by 等),结果就会一一返回。

查看数据分区

/var/lib/clickhouse/data/database_name/table_name
optimize table {table_name}

优化表会强制合并分区,数据现在在单个分区中


  • https://stackoverflow.com/questions/51899472/clickhouse-split-output-on-select
  • https://stackoverflow.com/questions/55302833/why-does-clickhouse-client-return-multiple-tables