物化视图、索引设计与报表性能优化
物化视图、索引设计与报表性能优化 1. 对应简历段落 这篇文章对应简历中“负责核心业务系统报表 SQL 优化,参与 Oracle 物化视图、索引和统计口径迁移改造,在 OceanBase 环境下通过预聚合、索引设计和异步任务提升报表性能”等经历。 面试官问报表优化,通常不满足于“加索引后快了”。他会继续问:报表为什么慢?是明细数据太大、join 太多、聚合太重、日期条件不走索引,还是统计口径适合预计算?物化视图迁移到目标库后怎么替代?索引怎么兼顾查询和写入?日报、月报、实时看板分别怎么设计? 成熟回答要体现“按时效性和成本选方案”:实时列表优先靠索引和 SQL 改写;准实时看板可以增量汇总;T+1 报表适合批处理预聚合;复杂多维分析则考虑宽表、汇总表或数仓,而不是把所有压力压在 OLTP 主库上。 2. 业务背景 老系统中有大量经营分析和管理报表,比如机构保费日报、客户转化漏斗、活动效果统计、代理人业绩排名、产品销售分布、续保提醒明细。这些报表通常要关联客户、保单、机构、人员、活动、产品等多张表。 Oracle 时代可能使用物化视图承载部分预计算: CREATE MATERIALIZED VIEW mv_org_daily_premium REFRESH COMPLETE ON DEMAND AS SELECT org_id, TRUNC(create_time) AS biz_date, SUM(premium) AS total_premium, COUNT(*) AS policy_count FROM policy_order WHERE status = 'PAID' GROUP BY org_id, TRUNC(create_time); 迁移到 OceanBase 后,物化视图能力、刷新机制和兼容性要重新评估。即使目标库支持类似能力,也不能盲目照搬,因为报表的瓶颈不一定是“没有物化视图”,可能是统计口径混乱、索引设计不合理、实时性要求过高,或者 OLTP 与报表负载混在一起。 业务上,报表有不同实时性要求。销售首页可能希望接近实时;管理层日报通常 T+1 可以接受;月度结算要求准确但不一定秒级;导出明细可以异步。优化方案必须围绕这些要求设计。 3. 核心原理 报表 SQL 慢的原因主要有四类。 第一,扫描数据多。报表经常按月、季度、机构范围统计,涉及百万到千万级明细。没有有效分区或索引时,只能大范围扫描。 第二,聚合成本高。GROUP BY、COUNT DISTINCT、多维度统计会产生排序、哈希聚合和临时结果。 第三,join 链路长。客户、机构、人员、产品、活动维表都要关联,任何一个 join 条件缺索引都会放大中间结果。 第四,实时性和准确性要求冲突。越实时,越倾向查明细;越快,越倾向预聚合。二者需要按场景取舍。 物化视图的本质是把查询结果提前计算并存储起来。它适合读多写少、口径稳定、刷新窗口可控的报表。缺点是刷新成本、数据延迟、存储成本和口径变更成本。 索引适合加速选择性较高、访问模式稳定的查询。报表索引设计常见思路是: ...