第 16 章 · ClickHouse 性能调优

四个交互演示:① EXPLAIN 三剑客对比 · ② 慢查询排查流程图 · ③ 反模式 vs 正确做法案例库 · ④ 火焰图样例

同一条 SQL,三种 EXPLAIN 给你三种视角

选左边的按钮切换 EXPLAIN 命令,右侧输出对应的真实结果(在 ClickHouse 24.x 上抓取)。

SELECT user_id, count() AS pv FROM learn_ck.events_v2 WHERE event_date BETWEEN '2025-04-01' AND '2025-04-30' AND country = 'CN' GROUP BY user_id ORDER BY pv DESC LIMIT 10;

        
口诀: ESTIMATE 看「打不打」 · PLAN 看「怎么打」 · PIPELINE 看「几只手打」 · query_log 看「打完损耗了多少」。

「业务说慢」之后,老 DBA 是怎么走流程的

遇到慢查询不是上来就改 SQL,而是按这条 SOP 一步步收敛问题域。

flowchart TD
  A[业务反馈慢 / 监控告警] --> B[system.query_log
找出 query_id] B --> C{看 ProfileEvents
SelectedParts / SelectedMarks} C -->|大| D[索引/分区裁剪没生效] C -->|小| E[扫描已经很省
瓶颈在 CPU/内存] D --> D1[加分区键到 WHERE] D --> D2[调整 ORDER BY 主键序] D --> D3[加 Skip Index] E --> F{看 memory_usage} F -->|接近上限| G[GROUP BY/JOIN 内存爆] F -->|不大| H[CPU 热点] G --> G1[启用 external_group_by] G --> G2[字典化右表/Dictionary] G --> G3[改写聚合算法] H --> H1[trace_log + flamegraph] H1 --> H2{热点函数} H2 -->|Decompress| H3[换 LZ4 / 升级 SSD] H2 -->|Hash| H4[降基数 / 改 GROUP BY] H2 -->|Sort| H5[利用 ORDER BY 主键序]
关键原则:不要凭直觉改,每一步都要有 system.* 视图的客观证据支撑。

8 大反模式 vs 正确做法

点击下面的卡片,下方展示「反模式 / 正确做法」并排对比,包含真实 DDL/SQL 与原因解释。

火焰图(Flame Graph)怎么读

横轴 = CPU 时间占比;纵轴 = 调用栈深度(栈底在下);颜色仅用于区分相邻函数,无大小含义。鼠标悬停看函数名 + 占比,单击查看调优建议。

解压 / 反序列化 聚合 / Hash 读取 / IO 排序 其他
点击柱条查看「这一段为什么宽 → 怎么调优」。
真实抓法: 1) 启用 trace_log;2) SET query_profiler_cpu_time_period_ns=10000000; 3) 跑慢 SQL;4) clickhouse-flamegraph --query-id=<qid> --output-dir=./flame