0Pricing
SQL Academy · 课时

何时进行预聚合

根据数据新鲜度和成本,在实时聚合、物化视图与下游 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 普通视图:逻辑复用
  2. 可更新视图与 INSTEAD OF 触发器
  3. 物化视图与 REFRESH 策略
  4. 何时进行预聚合
← 返回 SQL Academy