为何ClickHouse的com.github.housepower.jdbc.ClickHouseConnection性能优异?
com.github.housepower.jdbc.ClickHouseConnection的getSampleBlock+sendInsertRequest插入ClickHouse性能优异? 基于原生TCP协议的列存适配
housepower JDBC是基于ClickHouse原生TCP协议实现的,而非通用JDBC的文本协议,直接规避了SQL解析、文本序列化这类额外开销。sendInsertRequest以列块(Block)形式发送数据,和ClickHouse的列存储模型天然匹配,不需要做行转列的额外转换。样本块复用元信息,避免重复开销
getSampleBlock提前拉取了目标表的完整schema元信息(列类型、顺序、编码规则等),后续插入的Block直接复用这些元数据,省去了每次插入都请求或解析表结构的成本。而且样本块结构和目标表完全对齐,减少了数据校验、结构转换的环节。批量列式写入的高效处理
这种方式是批量列级写入,对比单条INSERT的行式插入,能大幅降低网络交互次数。同时,列式写入可以充分利用ClickHouse的向量化处理能力,服务端无需再做行到列的转换,直接将数据写入对应列的存储文件,IO效率拉满。减少中间序列化开销
直接操作Block对象时,数据在内存里就是列的组织形式,不需要转成JSON、CSV这类中间格式,避免了序列化/反序列化带来的CPU消耗。housepower的Block实现和ClickHouse服务端的Block结构完全一致,传输时直接做二进制序列化,效率远高于文本格式。跳过通用适配层的冗余逻辑
对比通用JDBC驱动的部分模式或ORM框架,这种方式跳过了大量通用适配层的封装逻辑,直接对接ClickHouse底层写入接口,砍掉了不必要的中间处理开销。
内容的提问来源于stack exchange,提问作者Angle Tom

