Database Query Performance Optimization
查询性能优化是 数据库 常见问题,是产品 POC(Proof of Concept) 中一定会有的环节(因为容易量化)。[1]
目标
- 从 应用 角度出发
- Latency
- Throughput
- 从 系统 角度触发
- CPU
- IO
- Memory
- Network
发现查询性能问题
主要分为两类:
- 利用数据库内置可观测工具、性能优化工具发现问题
- 利用 Linux 通用性能测试工具发现问题
数据库
以 ClickHouse 举例,可以通过 EXPLAIN
语句分析执行计划、索引命中情况;可以通过系统表分析阶段耗时...
CPU Sampling
可以利用 perf。
Off CPU Tracing
通常性能瓶颈并不在 CPU 上,而是 IO、网络、锁等问题上,这时就需要 Off CPU 分析,这种情况 Sampling 的性能工具往往没有效果,因此需要使用基于 Trace 的性能工具,比如 eBPF。
其他工具
Linux 针对不同模块问题都有对应工具进行分析,下图来自 reddit:
Optimizer Plan Test
SQL 是声明式查询语言,对于一个 SQL 的执行路径可能有成千上万条,优化器最终选择的 Plan 不一定是最优的,人也同样难以判断哪种最优:
- 执行计划太多
- 执行计划的性能和每个算子性能、集群规模、数据特点甚至硬件资源都有关系
此时,需要专门的优化器计划测试工具去枚举测试不同执行计划的性能。
优化查询性能
TODO