知识卡片
物化视图与数据立方体用预计算换查询速度但牺牲查询灵活性
内容
数据仓库查询经常反复用到相同的聚合函数(COUNT、SUM、AVG、MIN、MAX),如果同一种 聚合被许多不同查询频繁使用,每次都从原始数据重新算一遍是浪费的,可以缓存起来。 这种缓存叫物化视图:和普通的虚拟视图(只是查询的语法糖,读取时会展开成底层查询 再执行)不同,物化视图是查询结果的实际副本、真正写入磁盘的数据。代价是当底层 数据变化时,物化视图需要同步更新,这让写入变得更昂贵——这正是OLTP数据库很少用 物化视图的原因(写入频繁、对写延迟敏感),但在读多写少的数据仓库场景下,这个代价 往往是值得的。物化视图的一个常见特例是数据立方体(OLAP立方):把每个事实按照 不同维度组合分组聚合,构成一个多维网格——比如只有”日期”和”产品”两个维度时,可以 画出一张二维表,每个格子存这个日期-产品组合下所有事实的聚合值(如总销售额), 再沿行或列继续求和就能得到”按产品汇总不分日期”或”按日期汇总不分产品”的降维汇总。 真实场景里维度通常远不止两个(比如日期/产品/商店/促销/客户共五个维度),原理不变, 只是维度更高、更难直观想象。数据立方体的优点是某些查询变得极快,因为已经被预先 算好了;缺点是失去了查询原始数据的灵活性——比如立方体没有把”价格”当作一个维度, 就无法临时计算”哪个比例的销售来自单价超过100美元的商品”这类问题。正因如此,大多数 数据仓库会尽量保留完整的原始数据,只把数据立方体这类聚合结构当作对部分常见查询的 性能优化手段,而不是原始数据的替代品。
参考来源
- 位置:《数据密集型应用系统设计》第三章《存储与检索》"聚合:数据立方体和物化
视图"(源文件:_epub-src/ch3_split_003.html)
- 结论依据:原文说明物化视图是查询结果的实际磁盘副本、更新代价高因此OLTP少用而
数据仓库更适合,数据立方体是按维度分组聚合的物化视图特例,并指出其优点是特定
查询变快、缺点是失去查询原始数据的灵活性,因此数据仓库倾向保留原始数据、只把
聚合结构当性能优化,直接支撑本卡片结论。
- 原始内容:不同的是,物化视图是查询结果的实际副本,写入磁盘……这样的更新使得
写入成本更高,这就是在OLTP数据库中不经常使用物化视图的原因……物化数据立方体
的优点是某些查询变得非常快……缺点是数据立方体不具有查询原始数据的灵活性……大多数
数据仓库试图保留尽可能多的原始数据,并将聚合数据仅用作某些查询的性能提升。