文章目录
-
- 一、OLAP数据库是什么?先把定义说清楚
- 二、上了OLAP数据库还慢,先查这四件事
- 三、OLAP数据库靠什么把大查询跑快
-
- 看执行计划,我只看四个数
- 四、边界:OLTP、数仓、湖仓、HTAP,别混着用
- 五、选型前,先做七天负载画像
- 六、复盘:300张报表迁移后,我们改了三处
- 七、迁移验收清单
- 八、常见问题
- 九、三条避坑经验
- 写在最后
大家好,我是数据库小学妹👋我踩过的坑,你别再踩。
去年一家制造企业上了一套 OLAP 数据库。300 张报表原样迁过去,上线第一个月,六成报表变慢。最慢的一张,从 2 分钟变成 18 分钟。老板问我:是不是买错了?
我没急着回答。先拉了三天的慢查询,又看了文件数、分区和统计信息。问题不在引擎。他们只是把交易库的用法,原封不动搬到了分析库。这篇写给正在做报表选型的同学。也写给已经上了 OLAP 数据库、却没觉得变快的人。我会讲清三件事。OLAP 数据库是什么。它和 OLTP、数仓、湖仓的边界在哪。迁移前后该验什么。
一、OLAP数据库是什么?先把定义说清楚
OLAP 数据库,是面向联机分析处理(OLAP)的数据库系统。它按多维模型组织数据。擅长对海量历史数据做聚合、切片和下钻。三个关键词:多维、聚合、历史数据。
别把它当成一款软件的名字。OLAP 首先是一类查询负载,其次才是一套承载它的系统。交易库、数据仓库、湖仓,都可能跑 OLAP。所以选型时先别问“哪个 OLAP 数据库最强”。先问“我们的分析负载长什么样”。这句话听着虚,后面每一节都会落到具体指标上。
二、上了OLAP数据库还慢,先查这四件事
很多团队把 OLAP 数据库当成提速插件。表一迁,索引一建,就等报表变快。现实往往相反。下面四类问题,我在迁移项目里见得最多。
| 报表越跑越慢,重启也不稳 | 小文件太多,元数据压力大 | 文件总数、平均文件大小、每天新增文件数 |
| 只查一个月,却像扫了三年 | 分区键和常用过滤条件不匹配 | 分区字段、扫描分区数、分区裁剪有没有生效 |
| 同一条 SQL 时快时慢 | 统计信息过期,CBO 估算跑偏 | 统计信息更新时间、估算行数与真实行数差多少 |
| 早晚高峰一起卡 | 高频点查打到了分析库 | QPS、查询类型分布、单条查询读取的列数 |
小文件是第一大坑。列存引擎按文件读。几万个几 MB 的文件。打开和元数据开销,比数据本身还大。先看文件数,再看平均大小。分区键是第二大坑。报表九成按日期过滤,分区却按客户 ID 切,扫描范围自然收不住。分区键要跟最常用的过滤条件走。
统计信息最容易被忽略。CBO 靠它估行数。估算差两个数量级,join 顺序、广播策略都会选错。大批量导入后不收集统计信息,第二天就可能出事。最后是点查。列存适合大范围扫描,不适合高频按主键取一行。一条点查要读很多列,QPS 一高就互相挤。点查回交易库,分析库只接聚合。
这四件事跟引擎无关。换成电科金仓 KES,也要先查分区键和统计信息。点查该去哪,同样要分清。
三、OLAP数据库靠什么把大查询跑快
知道它为什么慢,还要知道它凭什么快。OLAP 数据库的性能不是单点魔法,是几套机制一起工作。列式存储决定 IO 效率。行存按整行读,列存按列读。分析查询通常只碰几列,列存能把无关列跳过。同一列类型一致,压缩率也更高。
向量化执行决定 CPU 效率。传统执行器一行一行算。向量化一次处理一批值。函数调用和分支判断都少了,缓存命中也更好。MPP 决定并行度。一个大查询拆到多个节点跑,再汇总结果。节点之间靠网络交换数据。数据分布不均,就会出现木桶效应。
CBO 决定走哪条路。它根据统计信息估算代价,选一条它认为最便宜的。统计信息一过期,计划就可能跑偏。预聚合决定能省多少计算。常用汇总提前算好,查询直接读。快,但占空间,刷新也有成本。这五样要一起看。只调一个点,很容易按下葫芦浮起瓢。加了预聚合,查询快了,刷新任务却把写入压垮。扩了节点,扫描快了,网络交换成了新瓶颈。
KES 的优化器同样吃统计信息。物化视图能承担一部分预聚合。机制相同,基础活一样不能省。
看执行计划,我只看四个数
| 扫描行数与读取字节 | 实际读了多少数据 | 过滤后行数没降,说明分区或索引没生效 |
| shuffle 数据量 | 节点之间搬了多少数据 | 远大于扫描量,说明 join 或聚合键选错 |
| 峰值内存 | 单个算子吃了多少内存 | 频繁落盘,说明内存不够或数据倾斜 |
| 端到端耗时 | 时间花在哪一段 | 扫描快、汇总慢,问题多在 shuffle |
估算行数和真实行数对不上,先别改 SQL,去更新统计信息。统计信息没跟上,CBO 只能猜。猜错一次,后面调什么都是白费。这个顺序反了,调半天也是白调。
四、边界:OLTP、数仓、湖仓、HTAP,别混着用
这几个概念经常被放在一句话里比较。其实它们不在一个层级。混着问,选型就会绕圈。先看表。
| OLTP 数据库 | 处理当前事务,保证一笔业务正确落库 | 为 OLAP 提供源数据,不承担大范围分析 | 别拿它跑全量聚合,容易拖垮交易 |
| OLAP 数据库 | 多维聚合、切片、下钻、即席查询 | 本身就是分析负载的承载者 | 别拿它接高频点查 |
| 数据仓库 | 面向分析的存储与建模底座 | 可以承载 OLAP,但 OLAP 不只存在于数仓 | 别把它当成一款查询引擎来选 |
| 数据湖 | 存原始文件和多格式数据 | 湖上可以跑 OLAP,但要配引擎和元数据管理 | 别指望只存文件就能直接出报表 |
| 湖仓一体 | 在湖上建仓,开放表格式 | 为 OLAP 提供统一存储底座 | 别忽略小文件治理和元数据服务 |
| 融合数据库(KES) | 一套底座承接交易、分析与多模数据 | 能承载部分聚合负载,少一次搬运 | 分析负载重、查询又散时别硬收 |
| HTAP | 一套系统兼顾事务与分析 | 可能减少数据搬运,但要先做资源隔离 | 别假设它天然互不干扰,必须压测 |
记住一句话。数仓、数据湖、湖仓一体是底座,OLAP 是负载,HTAP 是架构选择。融合库也是架构选择。它不等于把数仓、湖仓和 OLAP 全塞进一套系统。底座可以承载多种负载,负载也能跑在不同底座上。有人问“OLAP 数据库能不能替代数据仓库”。这个问题本身就把两个层级混在了一起。数仓管存和管,OLAP 管查和算。替代不了,也没必要替代。
五、选型前,先做七天负载画像
选型不要从产品参数表开始。先把自己的负载写清楚。我通常让团队先跑七天画像,只收六类数据。数据不多,但每项都要有出处。
| 查询类型分布 | 按 SQL 模板归类,统计点查、范围扫描、聚合各占多少 | 要不要独立分析库,点查要不要切走 |
| 单次扫描字节 | 慢查询日志加执行计划 | 数据量级和分区是否合理 |
| 峰值并发 | 按小时统计活跃查询数 | 引擎并发模型能不能扛住 |
| 数据新鲜度 | 业务能接受 T+1、小时级还是秒级 | 要不要实时链路,成本差多少 |
| 数据量与日增 | 明细表行数、每日增量、保留周期 | 单机、集群还是湖仓 |
| 报表重合度 | 多少张报表查同一份明细 | 值不值得做预聚合或宽表 |
七天数据拿到手,再对照五条判断。数据量小于 1TB,查询以固定报表为主,能接受 T+1:数仓加预聚合,够用。数据量到 TB 级,查询维度多变,要求秒级响应:考虑列存 OLAP 引擎。交易和分析要共享同一份数据,事务不能停。先评估 HTAP 或融合架构,再做资源隔离测试。数据在湖上,格式开放,多个引擎共用:湖仓一体加 OLAP 引擎。PB 级历史明细,查询模式又复杂。独立分析集群更稳,别硬塞进交易库。
国产化替换的场景里,常会评估电科金仓 KES 这类融合库。它适合交易与分析同底座的项目。前提是分析负载可控。分区表、并行查询、物化视图,能接住一部分聚合负载。这类融合库的优势,是少一次数据搬运。但资源隔离、查询治理、统计信息维护,一个都不能省。评估之前,先拿上面六类数据做隔离测试。别只看单条查询的响应时间。如果分析是 PB 级,查询模式又很散。独立 OLAP 引擎仍然更合适。这个边界要先说清。
六、复盘:300张报表迁移后,我们改了三处
回到开头那家企业。他们的生产明细表有 12 亿行,300 张报表,原来跑在交易库上。白天不敢跑大报表,全堆到夜里。上了列存 OLAP 数据库后,SQL 基本没改,直接迁。结果六成报表变慢。我们查了三天,问题集中在这几处。
文件数 18.6 万,平均每个 4MB。分区键用的是 line_id,可九成报表按 finish_date 过滤。统计信息停在三个月前。还有 40 张报表,其实是按工单号点查。第一处,改分区。分区键换成 finish_date,按月切。历史数据按年归档,不再参与日常查询。
CREATE TABLE dwd_production_detail (
work_order_no VARCHAR(32),
product_id BIGINT,
line_id BIGINT,
finish_date DATE,
output_qty NUMERIC(18,2),
defect_qty NUMERIC(18,2),
cycle_hours NUMERIC(8,2)
) PARTITION BY RANGE (finish_date);
CREATE TABLE dwd_production_detail_2026_09
PARTITION OF dwd_production_detail
FOR VALUES FROM ('2026-09-01') TO ('2026-10-01');
不同产品对分区和统计信息的语法不一样。上面用通用写法示意。关键是分区字段要跟报表过滤条件一致。第二处,合并小文件。导入改成攒批,目标单文件 128MB 以上。小文件一少,元数据压力立刻下来。第三处,把点查切回交易库。分析库只留聚合。原来那 40 张点查报表,大多是车间看单条工单状态。本来就不该走列存。
— 迁移前:这类点查被放进了分析库
SELECT *
FROM dwd_production_detail
WHERE work_order_no = 'WO2026091800231';
改完之后,报表 SQL 统一改成聚合查询。明细层只负责写入和基础清洗。指标在查询时按业务口径汇总。下面这条按月、按产线聚合,是最典型的分析查询。
SELECT line_id,
finish_date,
SUM(output_qty) AS output_qty,
SUM(defect_qty) AS defect_qty,
SUM(defect_qty) * 1.0 / NULLIF(SUM(output_qty), 0) AS defect_rate,
AVG(cycle_hours) AS avg_cycle_hours
FROM dwd_production_detail
WHERE finish_date >= DATE '2026-09-01'
AND finish_date < DATE '2026-10-01'
GROUP BY line_id, finish_date;
大批量导入之后,统计信息要跟着更新。数据变了,行数分布也变了。CBO 还拿着旧数字,就会选错计划。动作不复杂,难在自动化和坚持。
— 各产品命令不同,这里只示意动作
ANALYZE TABLE dwd_production_detail;
改完的效果,我用四个数看。文件数、扫描字节、shuffle 量、P95 耗时。前三个看引擎干了多少活,最后一个看业务等多久。四个数放在一起,才看得出改对了没有。
| 文件数 | 18.6 万 | 1,240 |
| 单次扫描字节 | 2.4 TB | 86 GB |
| shuffle 数据量 | 310 GB | 12 GB |
| 最慢报表 P95 | 18 分 20 秒 | 6.4 秒 |
这组数字做过脱敏和等比处理,只用来说明排查路径,不要当 benchmark 看。这次复盘让我记住一件事。OLAP 数据库不是加速插件。它只放大正确的建模。建模错了,引擎越强,错得越快。
七、迁移验收清单
上线前,我会把下面八项逐条过一遍。每项都要有明确结果,不能靠感觉。验收不是走流程,是给自己留后路。少一项,后面都可能返工。
| 点查有没有留在交易库 | 分析库点查占比接近零 |
| 大表有没有分区 | 常用过滤字段能命中分区裁剪 |
| 小文件有没有合并 | 平均文件大小达到引擎建议值 |
| 统计信息是否自动更新 | 大导入后自动触发,不靠人记 |
| 报表 SQL 有没有 SELECT * | 只取需要的列 |
| 预聚合口径是否一致 | 和原始明细对得上,差异可解释 |
| 峰值并发压测过没有 | 按真实并发跑过一轮,不只看单条 |
| 回滚方案有没有 | 出问题能切回原路径 |
八、常见问题
OLAP 数据库和 OLTP 数据库有什么区别? OLTP 管当前事务,OLAP 管历史分析。一个按主键点查,一个大范围扫描聚合。延迟、并发、存储偏好都不同。
OLAP 数据库一定要用列存吗? 不一定。列存是主流,但不是唯一。行存加预聚合也能做分析。关键看查询模式和数据量级。
OLAP 数据库能替代数据仓库吗? 不能。数仓是底座,OLAP 是负载。数仓可以承载 OLAP,OLAP 也能跑在湖仓或独立引擎上。
上了 OLAP 数据库,为什么报表还是慢? 先查四件事。小文件、分区键、统计信息、点查混跑。多数问题不在引擎,在数据组织和查询写法。
九、三条避坑经验
第一条,把 OLAP 数据库当加速插件。换引擎不换建模,小文件、全表扫、点查混跑,一个都不会自己消失。第二条,只看厂商 benchmark。你的数据分布、查询模式、并发峰值,和样例不是一回事。PoC 要用自己的 SQL 跑,别用演示数据集。第三条,忽略统计信息和文件治理。这两个是日常活,不是上线前做一次。大导入后不收集统计信息,第二天就可能跑偏。
我第一次做迁移时,把 300 张报表跑通就当成功了。上线一周后,小文件把元数据压垮。我才知道跑通和跑稳是两回事。后来另一个项目做交易分析同底座,用的是电科金仓 KES。我们先把分区、统计信息和执行计划做完,再谈性能。顺序对了,很多问题根本不会出现。
写在最后
OLAP 数据库是什么?一句话:面向多维分析查询的一类数据库系统。它解决扫描、聚合和并行计算。不解决建模混乱,也不是一颗提速药。选型顺序别反。先看负载,再看边界,最后看产品。先把分区、文件、统计信息理清。再谈换不换引擎。
说到底,它是一套关于取舍的系统。要更快的聚合,就得接受列存、分区和预聚合的维护成本。要交易和分析同底座,就得接受资源隔离和查询治理。这也是我看 KES 这类融合库的角度。分区裁剪、并行查询、物化视图,都能接住一部分分析负载。但工具替代不了组织方式。分区、统计信息、执行计划,得先理清楚。同底座能少一次搬运,也少一处口径不一致。
所以别急着问该买哪个 OLAP 数据库。先问三件事。负载有多重。哪些查询必须秒级。团队能不能长期维护分区、统计信息和预聚合。这三问答完,产品名单自然会短。选到最后,拼的不是参数,是谁能把基础活长期做下去。你们现在卡在哪一步?评论区说说,我帮你拆。
我是数据库小学妹,帮你少走弯路少踩坑,咱们下篇见👋


