数据仓库,是一个独立的数据库,主要负责分析查询数据,而不会影响 OLTP 操作.数据仓库中包含公司在各种 OLTP 系统的数据的只读副本.数据从 OLTP 数据库中提取(周期性的进行数据转储或持续不断的更新),将提取的数据的结构转为易于分析的结构,然后加载到数据仓库.这样过程称为提取-变换-加载(Extract-Transform-Load)
使用一个单独的数据仓库,而不是查询 OLTP 数据库直接分析.是因为数据仓库可以根据访问的特点优化查询.上一篇讨论的存储索引结构,通常都适用于 OLTP 数据库,但不适用于 OLAP 系统.接下来我们来看看适用于 OLAP 系统的存储索引结构.
3. 面向列的存储
在典型的数据仓库中,表的结构通常非常宽.事实表通常有超过一百列,有时设置为几百列.而通常数据仓库的查询只访问一次 4 或 5 列的查询.
大多数的 OLTP 数据库,存储是面向行的:一行之中的所有值会连续存放.
但是,当一个 OLAP 的存储查询需要少数的列时(每行由 100 多个列组成),需要将数据从磁盘加载到内存中,并解析它们,并过滤掉那些不符合所需条件的列.这会造成很多不必要的查询消耗.
列存储
面向列存储的思想很简单:不要将所有值从一行存储在一起,而是将每个列中的所有值存储在一起.如果每个列都存储在一个单独的文件中,那么查询只需要读取和解析查询中使用的那些列,并且同样的列会更加易于压缩存储,这样就可以减少大量的工作.
列压缩
通常列中的数据会出现重复,这就大大适用于压缩策略.可以根据列中的数据,使用不同的压缩技术.位图编码是数据仓库中的十分有效的压缩技术:
列排序
在列存储中,存储行的顺序并不重要.最简单的就是将它们按照插入的顺序排序,因为插入一个新行只意味着追加到每个列文件中.但是,选择逻辑顺序,可以带来几点好处.
(1) 排序之后的列是有序的,更有利于定位查询数据.(如:按照时间排序,查询某个时间段内产生的数据)
(2) 它有助于压缩列.如果主排序列没有许多不同的值,那么在排序之后,它将有许多重复的序列.简单的编码压缩之后,就可以极大的降低存储开销.
注意,对每个列进行独立排序是没有意义的,因为我们将不再知道列中属于哪一行.可以新建一个索引来指向对应的行.有序又要求高效,所以排序列的存储通常都是通过上文提及的 SSTable 格式在内存之中灵活处理.
4. 聚合:物化视图
数据仓库另一个常用的优化方式是:物化视图.如前所述,数据仓库查询通常涉及聚合函数,如 SQL 中的计数,总和,平均值,最小值或最大值.如果相同的聚合被许多不同的查询使用,那么每次都对原始数据进行处理是十分浪费的.为什么不缓存查询中经常使用的一些计数或总数呢?
在关系型的数据模型中,它通常被定义为标准(虚拟)视图:一个表一样的对象,其内容是一些查询的结果.虚拟视图只是编写查询的快捷方式.当您从虚拟视图中读取时,SQL 引擎将它展开为视图的底层查询,然后处理展开的查询.而物化视图是将实际的查询结果写入磁盘,不需要额外的计算过程.但是当底层数据发生变化时,物化视图需要更新,因为它是一个非规范化的数据复制.(类似于触发器的工作原理).所以物化视图是不常用于 OLTP 数据库,而在数据仓库进行 ETL 时进行更新.
物化视图的好处是: 某些查询变得非常快因为他们已经被预先计算.
但物化视图的缺点是: 查询原始数据的灵活性不足. 例如,没有办法计算哪种销售成本超过 100 美元的商品的比例.因此,大多数数据仓库尽量保留尽可能多的原始数据,并且只使用物化视图作为对某些常用查询的性能提升.
小结:
梳理了 OLAP 与数据仓库的联系,同时总结了几种在数据仓库种子常用的存储结构与对应的优化方式.接下来,我们进入下一章来看看编码在存储之中的意义.
来源: https://www.cnblogs.com/happenlee/p/8243402.html