Flux 12: 性能优化
性能优化不能脱离架构。cpp/pl/flux 早期是 eager interpreter,所有数据尽量变成 TableValue,再由 builtin 一步步处理。这条路径简单、可测、适合小数据,也非常适合把语言语义先跑通。
但查询引擎一旦开始面对 SQLite/MySQL、大表 scan、group aggregate、top-n、join 和 profile,性能问题就不再是“某个函数慢一点”。真正的瓶颈往往来自执行模型:整表 materialization、row object 中间态、重复 key 构造、connector 读了太多列、blocking operator 没有内存边界。
这一篇讲 Flux 性能优化的主线:先用 profile 定位瓶颈,再把热路径从 TableValue 推向 Page streaming,通过 connector pushdown 减少数据移动,用 partial/final accumulator 降低 root 阶段压力,最后用 benchmark 固定同机同口径的比较方法。
一条查询背后的成本
先看一条典型查询:
import "sqlite"
sqlite.from(path: "metrics.db", table: "cpu")
|> range(start: 2024-01-01T00:00:00Z, stop: 2024-01-01T01:00:00Z)
|> filter(fn: (r) => r.region == "west" and r._value > 80.0)
|> keep(columns: ["_time", "host", "_value"])
|> group(columns: ["host"])
|> mean(column: "_value")
|> sort(columns: ["_value"], desc: true)
|> limit(n: 10)它看起来只是几行 pipe,但执行时至少有几类成本:
