何时进行预聚合
根据数据新鲜度和成本,在实时聚合、物化视图与下游 OLAP 之间做出选择
何时进行预聚合 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
聚合查询的三种策略
- 实时——每次重新计算
- 物化——存储结果并定期刷新
- 触发式/缓存式——每次更改时增量更新
实时聚合
简单且始终保持最新:
SELECT user_id, COUNT(*) FROM orders WHERE status = 'paid' GROUP BY user_id;何时实时聚合足够
查询速度足够快(索引良好、结果较小、调用不频繁)。默认使用实时方案——只有在通过测量发现性能问题时才进行优化。
物化聚合
适用于开销大且要求“足够新”的报告:
CREATE MATERIALIZED VIEW user_revenue_30d AS
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY user_id;
-- Refresh nightly:
REFRESH MATERIALIZED VIEW CONCURRENTLY user_revenue_30d;触发式 / 增量聚合
对于实时仪表板,请使用触发器维护汇总表:
CREATE TABLE user_summary (
user_id BIGINT PRIMARY KEY,
order_count INT NOT NULL DEFAULT 0,
revenue NUMERIC(12,2) NOT NULL DEFAULT 0
);
CREATE FUNCTION incr_summary() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO user_summary (user_id, order_count, revenue)
VALUES (NEW.user_id, 1, NEW.total)
ON CONFLICT (user_id) DO UPDATE
SET order_count = user_summary.order_count + 1,
revenue = user_summary.revenue + EXCLUDED.revenue;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_summary AFTER INSERT ON orders
FOR EACH ROW EXECUTE FUNCTION incr_summary();权衡
| 策略 | 新鲜度 | 写入开销 | 读取开销 |
|---|---|---|---|
| 实时 | 即时 | 无 | 高 |
| 物化 | 过时 | 批量刷新 | 低 |
| 触发式 | 即时 | 每次写入 | 低 |
根据读写比例进行选择
- 写入多、读取偶尔发生 → 实时(或批量物化视图)
- 读取多、写入适中 → 物化视图
- 读取和写入都多,且新鲜度至关重要 → 触发式汇总
外部预聚合
对于数据仓库规模的分析,请将聚合交给:
- OLAP 数据库(ClickHouse、Druid)
- 独立数据仓库中的 dbt 模型
- TimescaleDB 连续聚合(Postgres 扩展)
汇总表与物化视图
自定义汇总表支持增量更新;物化视图则必须完整刷新。请在开发工作量与运维简洁性之间进行权衡。
避免在高负载表上使用触发器
基于触发器的汇总会为每次操作增加写入延迟。对于高频表(事件、指标),优先采用批量物化视图刷新。
谨防缓存失效
“CS 中只有两件事很难。”触发式汇总就是一种缓存。其中的错误会表现为仪表板数字不正确。请添加每日校对任务,根据源数据重新计算结果。
物化多阶段处理流程
串联物化视图:第 1 阶段聚合事件,第 2 阶段聚合第 1 阶段的结果。请按顺序刷新。
回顾
当读取成本占主导时,请进行预聚合。
- 实时 → 最简单,始终保持最新
- 物化视图 → 查询开销大,允许过时
- 触发式汇总 → 始终保持最新,但会增加写入成本
- 根据您的读写特征进行选择
快速检查
您有一个实时仪表板,必须显示精确到秒的用户收入。哪种策略最合适?
常见问题解答
「何时进行预聚合」课时是免费的吗?
是的 — 「何时进行预聚合」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「何时进行预聚合」这节课中我会学到什么?
根据数据新鲜度和成本,在实时聚合、物化视图与下游 OLAP 之间做出选择 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「何时进行预聚合」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。