深入浅出数据库宽表
在企业级数据场景中,一个报表查询往往需要 3 张以上表的 JOIN,这类查询在数据量较大的场景下,需要数分钟甚至个把小时才能返回。
本文将简要探讨宽表技术的来龙去脉,以及它如何帮助解决多表关联带来的性能瓶颈,并结合 CloudCanal 最新推出的可视化宽表构建功能,无痛实现跨表数据的实时整合。
数据分析困境
在结构化数据系统中,随着业务模型的复杂化,数据表之间的关联不断增多。以电商系统为例,订单、商品、用户等表结构天然具有关联性:
- 订单数据:商品 ID (关联 商品数据)、数量、总价、优惠信息、买家 ID (关联 用户数据)等
- 商品数据:名称、颜色、质地、库存、商家 ID (关联 用户数据)等
- 用户数据:账号、密码、昵称、手机、邮箱等
关系型数据库通过建立关系范式实现了存储效率最大化(冗余信息少),并优化了事务型操作的性能。但一旦进入数据分析阶段,这种表结构会给查询带来极大挑战。
在进行批量聚合、筛选等复杂分析时,如“计算过去 1 个月商品销售额 Top 10”,往往需要多表 JOIN 操作。而随着关联表数量增加,可能的执行计划(搜索空间)也呈几何级增长:
| 关联表数量 | 排列种类 |
|---|---|
| 2 | 2 |
| 4 | 24 |
| 6 | 720 |
| 8 | 40320 |
| 10 | 3628800 |
对于一个 ERP 或 CRM 系统而言,5 张表以上的关联是常态。面对如此庞大的执行计划可能性,如何高效地找到最优解 成为数据库分析查询的核心难题。
面对这一挑战,行业演进出了两种技术路线:查询优化 和 预计算。而 打宽表 是预计算的核心能力之一。
查询优化 vs 预计算
查询优化
面对这么多种可能性,解决方式之一就是通过减少可能性加快搜索,这就是数据库优化器术语——剪枝。其中衍生出两种技术:基于规则的优化器(RBO: Rule-Based Optimizer) 和 基于代价的优化器(CBO: Cost-Based Optimizer)。
-
基于规则的优化器(RBO):RBO不考虑数据实际分布,而是依据预设的静态规则对 SQL 执行计划进行调整。市面上的数据库产品,都有一些通用的优化规则,如谓词下推等。不同数据库产品基于其业务属性和架构特点,还拥有独特的优化规则,如 SAP Hana 承载 SAP ERP 业务,针对全内存和大量 JOIN 的场景,其优化器规则便与其他数据库存在显著差异。
-
基于代价的优化器(CBO):相较于 RBO,CBO 通过评估不同执行计划的 I/O、CPU 等资源消耗,选择代价最低的计划。这种优化方式会通过数据的具体分布与查询 SQL 的特点来动态调整,即使两条一模一样的 SQL,因为设置的参数值不一样,可能最后的执行计划大相径庭。CBO 一般具备一个精密复杂的统计信息子系统,包括各个表的数据量、基于主键或者关联维度的数据分布直方图等信息。
现代数据库内核一般会联合使用 RBO 和 CBO 对 SQL 进行优化。
