<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>报表 on </title>
    <link>/tags/%E6%8A%A5%E8%A1%A8/</link>
    <description>Recent content in 报表 on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sun, 11 Oct 2026 08:50:00 +0800</lastBuildDate><atom:link href="/tags/%E6%8A%A5%E8%A1%A8/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ClickHouse 报表的对账和重算</title>
      <link>/posts/clickhouse-report-reconcile-rebuild/</link>
      <pubDate>Sun, 11 Oct 2026 08:50:00 +0800</pubDate>
      
      <guid>/posts/clickhouse-report-reconcile-rebuild/</guid>
      <description>背景 报表表由物化视图在明细每次插入时增量聚合（建法在用物化视图做交易报表）。物化视图只看每次新插入的块，看不到之后的合并、FINAL 和改数据，所以明细表折得掉的重复，报表不一定折得掉。偏了就要能发现、能修，修的时候还不能丢掉迟到写入、不能拖慢写入。
结论主要来自 clickhouse-lab 的实验 24、25、26（25.3.14.14，三副本），窗口那部分另有实验 02。明细表 events 是 ReplicatedReplacingMergeTree(create_time)，报表表 rpt 是按 UTC 半小时分桶、按天分区的 ReplicatedAggregatingMergeTree，这是改过之后的报表链路，还没部署到 Aiven 上的现有集群。
哪些重复会让报表多算 实验 25 造了三天、每天 30 万行的明细，所有写入都带 token，并且开着 deduplicate_blocks_in_dependent_materialized_views = 1（下一节细说）。然后按现有集群上见过的几种重复各注入一次，看报表偏了多少：
注入的情形 明细 FINAL 报表 lab 上报表偏了多少 sink 超时重投：同一批、同一个 token，去重窗口还记得 对 对 不偏 sink 重启重放：批次边界变了，token 也变了 对 多算 700 行，金额 360491.71 producer 重试：Kafka 里存了两份，offset 不同 对 多算 和下一行合计 130 行，金额 64191.68 改数据：按 ReplacingMergeTree 的惯例重发一条新版本 新值 新旧两份都算 同上 人工补发的正常迟到数据 对 对 不偏 偏差的量和注入的行数、金额完全一致。超时重投如果超出了去重窗口，报表同样多算，依据是实验 02 和实验 24 第五节。明细这边按键折叠之后是对的，报表上的偏差只能靠重算改回来：实验 24 里先写一行、再换 token 重放、再重发金额从 100 改成 150 的新版本，明细 FINAL 读到 150，物化视图累加成 350，对明细 OPTIMIZE … FINAL、两张表都合并之后还是 350。</description>
    </item>
    
    <item>
      <title>用物化视图做 ClickHouse 交易报表</title>
      <link>/posts/clickhouse-report-materialized-view/</link>
      <pubDate>Sun, 11 Oct 2026 08:20:00 +0800</pubDate>
      
      <guid>/posts/clickhouse-report-materialized-view/</guid>
      <description>背景 交易明细一天两三亿行，报表要按不同时区出日报、周报、月报。每次都从明细现算，读的是整天甚至整月的明细；明细表换成 ReplacingMergeTree 之后还要带 FINAL（查询路径那篇）。常见的做法是在写入时就把明细增量聚合进一张小得多的报表表，查询只读报表，官方最佳实践的说法是写入时增量计算之后，查询面对的数据小得多（Use materialized views）。
Aiven 上现有集群的聚合表按写入时间 create_time 的窗口增量累加，不按业务键去重。这篇写的是改过的报表链路：明细表 → 物化视图 → 报表表，桶按业务时间切。它在 clickhouse-lab 的实验 24、25 里跑过（25.3.14.14，三副本），还没部署到现有集群。报表会因为哪些重复多算、怎么对账和重算，放在报表的对账和重算那篇。
物化视图是插入时的触发器 ClickHouse 的增量物化视图，文档原话是「just a trigger that runs a query on blocks of data as they&amp;rsquo;re inserted into a table」（Incremental materialized view）。源表每插入一个块，就拿这个块跑一遍视图的 SELECT，结果写进目标表。
它只看得到这一次新插入的块，看不到源表里已有的数据，也看不到之后发生的合并、mutation 和删除。好处是代价和写入量成正比，不用回头扫明细；代价是明细后来被折叠、被修改，报表不会跟着变。这一点决定了报表必须能对账、能重算。
三张表怎么建 层 引擎 键 为什么这样建 明细 ReplicatedReplacingMergeTree(create_time) 和现表一致：按结算日分区，ORDER BY (settle_ms, id, rev) 现有集群上见过的三种重复都是除 create_time 外整行相同，排序键相同，合并或 FINAL 时折成一行 报表 ReplicatedAggregatingMergeTree UTC 的 30 分钟桶加维度，PARTITION BY toYYYYMMDD(bucket) 按天分区，和明细的日分区一一对应，修一天只换报表的一个分区 物化视图 CREATE MATERIALIZED VIEW … TO 报表表 — 显式写目标表：重算时要往报表表换分区；报表表本身可以单独 ALTER，不用连带重建视图 实验 25 里报表表和物化视图是这样建的，events 是明细表，表名换成了这个系列里统一的名字，引擎参数按现有集群的 Replicated 库省略：</description>
    </item>
    
  </channel>
</rss>
