Data Warehouse在早期的时候,大家都会使用同样的数据库来进行OLAP的分析,后来越来越多的公司会使用专用的数据库来做这件事情,我们称之为Datawarehouse。当我们要使用一个独立的Datawarehouse的时候,首先需要解决的问题就是如何获得相关的数据,通常来说,会从OLTP数据库来获取数据(使用一个周期性的数据dump或者连续的更新流等等),然后通过一定的流程把这些数据转换成特定分析的schema,再上传到相应的datawarehouse。这个流程一般称之为ETL(Extract-Transform-Load)。大体的流程见下图:
这种压缩的方法在不同值的个数和行数之间相差很大的情况下效果特别好。而且这种存储对一些查询也很友好,比如说WHEREproduct_sk IN (30, 68, 69):我们只要把product_sk=30和product_sk=68以及69的三个bitmap取出来,再或一下,就得到想要的结果了。是不是特别方便?另外一点就是有时我们需要做范围的查询,而各个column其实保存的顺序并不重要(每个column自身内容的顺序不能变,因为是对应到相应的行),所以我们可以在保存的时候就按照column的值就行保存,这样范围查询就会得到一定的帮助。但是有时我们不同的查询会想要不同的排序方式。在这个方面有没有什么可以优化的空间呢?答案是有的,一个有趣的想法就是我们通常会为数据库保存不同的replia备份,而两个备份之间其实顺序并不是那么重要(只要最终内容是相同的即可),所以我们可以在不同的备份之间按照不同的顺序来组织,这样就能满足不同的排序需求了,只是说备份恢复以及不同查询的指向会需要一些额外的处理。
物化视图
Data warehouse的另外一个特点就是会有很多聚合的操作,比如COUNT,SUM, MIN 或者MAX等等。而这些聚合操作需要处理很多数据,因此相对来说速度就会比较慢。考虑到datawarehouse的特性,就是读远大于写,我们其实可以把这些聚合的结果cache起来,这样就不需要每次都来计算这些聚会的数据了。通常cache这些数据的手法就是物化视图(Materializedview),它和平常数据库中的视图是类似的,比较大的差别就在于它会把数据真正写到磁盘中。这也就意味着我们需要更新它的数据,所以这也是这种技术在我们通常OLTP的数据库中通常不使用的原因。物化视图的一个常见的case就是数据立方体(datacube),如下图所示,其实这个就和我们的excel表来计算聚合信息是类似的,我想大家一看应该就会明白。