ClickHouse 列存原理与写入路径与复制机制

共 20 题
#

1. ClickHouse 列存(Column-Oriented)原理,每列独立文件存储,查询仅读取所需列,配合 LZ4/ZSTD 压缩与 SIMD 向量化执行实现高吞吐分析?

A 数据按行存储
B 列存无法压缩
C 每列独立文件存储,查询只读所需列,配合 LZ4/ZSTD 压缩与 SIMD 向量化实现高吞吐分析 ✓ 正确答案
D 列存适合点查
#

2. ClickHouse 写入路径,INSERT 先写内存 buffer → 生成 part 目录 → 后台 merge 合并小 part;为何单次 INSERT 建议 ≥1000 行、避免逐行写入?

A 逐行写入效率最高
B INSERT 直接更新已有 part
C INSERT 生成 part 目录,后台 merge 合并小 part;单次插入 ≥1000 行可减少 part 数量、提升性能 ✓ 正确答案
D part 数量与查询性能无关
#

3. ClickHouse 复制机制,ReplicatedMergeTree 通过 ZooKeeper/ClickHouse Keeper 协调副本间的 part 日志与 mutation,多副本写入如何保证最终一致?

A 各副本独立写入,无需协调
B 通过 ZooKeeper/Keeper 协调 part 日志与 mutation,多副本异步同步达到最终一致,ZooKeeper 可用性影响复制 ✓ 正确答案
C 副本间无去重
D 复制是同步实时的
#

4. ClickHouse 的 MergeTree 写入路径,插入→临时分区→后台 merge 的全过程?

A INSERT 直接写入最终分区,无临时阶段
B INSERT 先写临时 part,再后台 merge 合并到最终分区,part 不可变、异步合并保证高吞吐 ✓ 正确答案
C merge 是同步的
D part 可以原地修改
#

5. ClickHouse 的分区(PARTITION BY)与分区裁剪、part 生命周期(detach/attach、DROP PARTITION)管理

A 分区不影响查询
B DETACH 会物理删除数据
C 分区裁剪跳过无关分区提升效率,DETACH 分离数据、DROP PARTITION 物理删除分区 ✓ 正确答案
D 无法按分区管理数据
#

6. ClickHouse 的编码压缩,LowCardinality、Delta、DoubleDelta、Gorilla 分别适合什么数据分布?与 LZ4/ZSTD 如何配合?

A LowCardinality 适合低基数重复值,Delta/DoubleDelta 适合有序时序,Gorilla 适合浮点时序,再配合 LZ4/ZSTD 块压缩 ✓ 正确答案
B Delta 适合随机数据
C LowCardinality 适合高基数数据
D 编码与块压缩互斥
#

7. async_insert 与 Buffer 引擎如何缓冲小批量写入以减少 part 数量?缓冲带来的可见性延迟与丢数据风险如何取舍?

A 它们缓冲小写入合并成批量以减少 part、提升吞吐,但带来可见性延迟与崩溃丢数据风险 ✓ 正确答案
B 它们立即落盘无延迟
C 缓冲不增加吞吐
D 它们直接写入小 part
#

8. ClickHouse 的稀疏主键索引(每 8192 行一个 mark)与跳数索引(minmax/set/bloom_filter)如何协同加速查询?

A 主键索引处理主键裁剪,跳数索引(minmax/set/bloom_filter)处理非主键列裁剪,多级过滤减少扫描 ✓ 正确答案
B 两者都只能过滤主键
C 跳数索引取代主键索引
D 跳数索引无构建开销
#

9. ClickHouse 与 Kafka 集成(Kafka 引擎表 + Materialized View)实现实时摄入的架构与延迟特征?

A 数据是毫秒级精确实时
B Kafka 引擎表消费,物化视图把数据写入目标表,延迟通常为秒级/亚秒级 ✓ 正确答案
C 物化视图不参与写入
D 目标表只能是普通表
#

10. ClickHouse 的 Projection 与物化视图在预聚合加速上的差异与适用场景?

A 两者完全相同
B Projection 需要改查询
C 物化视图对查询透明
D Projection 是表内物理预聚合,查询透明自动使用;物化视图是独立目标表,需显式管理 ✓ 正确答案
#

11. ClickHouse 副本机制(ReplicatedMergeTree/ZooKeeper)的同步与冲突解决?

A 副本各自独立不同步
B 冲突无法解决
C 副本无去重机制
D 副本通过 ZooKeeper 协调 part 日志同步,用块校验和与日志去重解决冲突,最终一致 ✓ 正确答案
#

12. ClickHouse 查询的向量化执行与列裁剪、分区裁剪如何协同?

A 分区裁剪定范围、列裁剪定列、向量化执行批量计算,协同减少 IO 与计算 ✓ 正确答案
B 三者互不相关
C 向量化取代裁剪
D 列裁剪增加 IO
#

13. ClickHouse 的 Part 与索引,primary.idx、skip index 与 merge?

A 索引是全局唯一的
B part 无索引
C merge 不重建索引
D 每个 part 含 primary.idx 主键索引与跳数索引,merge 合并 part 并重建索引 ✓ 正确答案
#

14. ClickHouse 的插入去重(块校验和)机制与幂等写入

A 每次插入都会重复
B 幂等只对单副本有效
C 校验和与去重无关
D 通过块校验和登记到 ZooKeeper 识别重复插入,实现幂等写入,防止重试导致重复数据 ✓ 正确答案
#

15. ClickHouse 的轻量级删除(lightweight delete,23.3+)与 ALTER TABLE ... DELETE 在实现机制上有何差异?为什么轻量删除只标记行(内部 _row_exists 掩码列)并在查询时过滤、由后台 merge 物理清理,而普通 mutation 要重写整个 part,二者在删除量级与实时可见性上如何取舍?

A 两者机制相同
B 轻量删除立即物理删除
C mutation 不重写 part
D 轻量删除标记行(_row_exists 掩码)由后台 merge 清理,适合大量小删除;mutation 重写 part 实时可见但开销大,适合大批量删除 ✓ 正确答案
#

16. Distributed 表如何把 INSERT 分发与缓冲到本地表?节点故障或重试时如何保证不重不丢?

A 无缓冲机制
B INSERT 一次性同步到所有分片
C 按 sharding_key 分发到本地表,支持异步缓冲,故障时通过重试与块去重保证不重不丢 ✓ 正确答案
D 故障导致必然丢数据
#

17. ReplicatedMergeTree 读副本时如何避免读到未同步的 part?replica 延迟与 load_balancing 配置如何影响读一致性?

A 副本延迟不影响读取
B 查询优先选择 parts 完整/健康的副本,load_balancing 控制副本选择策略,replica 延迟影响读一致性 ✓ 正确答案
C load_balancing 与读取无关
D 查询随机读任意副本
#

18. ClickHouse 的 Mutation(ALTER UPDATE/DELETE)为何是异步重写 part 而非原地更新?对写入吞吐与查询一致性有何影响?

A Mutation 原地立即更新
B Mutation 不影响写入
C part 不可变,Mutation 异步重写 part 执行,会占用后台资源、影响写入吞吐,期间查询可能新旧混合 ✓ 正确答案
D Mutation 是同步的
#

19. ClickHouse 的 JOIN 与子查询在分布式下的性能风险与优化手段?

A 分布式 JOIN 可能数据重分布产生开销,可用 GLOBAL JOIN、字典替代小表、利用本地性等手段优化 ✓ 正确答案
B 子查询不会重复执行
C 字典无法替代 JOIN
D 分布式 JOIN 无性能风险
#

20. ClickHouse 的查询缓存(Query Cache)与结果复用

A 任何查询都能被缓存
B 缓存结果永不失效
C 相同 SQL 且数据未变时复用缓存结果,降低延迟,适合重复执行查询,但数据更新后需失效 ✓ 正确答案
D 缓存增加计算量