正巧大后天就要考Data Warehouse(数据仓库)了,就凭借自己写一点基础的知识权当做一个考前的复习作用,以及作为一个基础的入门介绍吧
1. Motivation:
首先要明确为啥需要data warehouse,以及究竟什么是data warehouse。
没有数据仓库时,我们需要直接从业务数据库中取数据来做分析。业务数据库主要是为业务操作服务,虽然可以用于分析,但需要做很多额外的调整,在我看来,主要有以下几个问题:结构复杂,数据脏乱,难以理解,缺少历史,大规模查询缓慢。(OLTP) Online Transaction Processing
上面的问题,都可以通过一个建设良好的数据仓库来解决。
业务数据库是面向操作的,主要服务于业务产品和开发。而数据仓库则是面向分析的,主要服务于我们分析人员。评价数据仓库做的好不好,就看我们分析师用得爽不爽。因此,数据仓库从产品设计开始,就一直是站在分析师的立场上考虑的,致力于解决使用业务数据进行分析带来的种种弊端。(OLAP) Online Analytical Processing
What is data warehouse:
拿William H.Inmon’s 话来定义:
Data warehouse is subject-oriented, time varying, integrated, non volatile collection of data in support of management's decision analyse.
Subject-oriented: DW organised by several subject determined by requirements. 这句话我所理解的是因为数据仓库本书是没有数据的,所有数据来源都是来自不同的数据库,那么在建立的时候数据来源自然就由用户query时的需求所决定
integrated: the content results from the integration of data from multiple sources
time-varying: keeps track of data changes so that reports show evolution over time
non-volatile: new data can be added, but data is±never deleted nor updated. 实际上这也是olap和oltp主要的区别之一
现在市面上可以使用数据仓库主要通过以下产品:
Oracle,SAP,IBM,SQL server,teradata
open resource的有:
talend
下面这张图就详解的介绍了olap和oltp的区别:
可以简单的把oltp理解成原始的数据库,olap理解成数据仓库
2.数据仓库的基本架构和基本组成与模型:
由于传统的数据库中用的一般都是3NF的表,在BI显得过于复杂,故需要新的模型来支持data warehouse中的data
我们实际上利用Multi-dimensional model,由于它比较简单易懂,就是根据多个dimension将多个关系组成一个立方体(维度可以大于等于3)的形式。
在multi-dimensional model中的基本组成成分由下列几种:
Cube:指组成的那个立方体
Cell:交错的小方格
Fact:不为空的cell
Measure:不为空的cell的数值
Dimension:简单的讲就是组成cube的各个表
Facts:has a granularity = level of detail
主要分为两种fact:event(针对某个的时间或者地点),snapshot(强调在一定的时期范围内)
Dimension:是有层次之分的,比如有一个表中包含(Paris,Berlin,Lyon,London)可以对其做rollup使之聚类成为country层次的dimension, 本次均假设是线性的dimension,有个最大的层次ALL
Measure:有三种measure: additive 可加的意思上该measure在任何dimension均可相加并且有实际意义,semi-additive在某些维度可以相加有实际意义,non-additive 在任何维度均不可相加
对于multi-dimensional model有以下几种可能的操作形式:
ROLLUP(Cube,Dimension to Level, AggFunction(Measure)) 即刚才所说的向上聚合的过程
DRILLDOWN(Cube,Dimension to Level) 从高层次扩展到detail的过程
SLICE(Cube,Dimension, Level=value)
DICE(Cube,), with: boolean combination
3.数据仓库的基本存储形式
主要用三种形式来表达之前提到过的cube:
1.ROLAP:用relational database来存储数据
ROLAP可以较好的支持现有的数据库,利用relational database来存储cube,可以fit memory,只存储非空的cell,可以支持语义,比较容易维护
2.MOLAP:用array来存储数据
比较容易得到某个特定的数据,可以使用不在relational database下其他指令,没必要存储每个点的坐标
3.HOLAP:结合以上两种
由于ROLAP有对于原本就有的数据库的支持,主要介绍以下ROLAP下的几种不同类型的表格
1.Star Schema:
由一个fact table以及多个dimension table组成
fact table:由事实和dimension table 的FK组成,在star schema 的形式下dimension table里不允许再出现FK
2.Snowflake Schema:
由一个fact table 以及多个dimension table组成
此时与star schema最大的区别就在于对于dimension table下可以存放字结构的FK,被连接的dimension table 被称为outrigger dimension 支撑向量
3. Starflake Schema:
结合了上述两种schema的表现形式
4. Galaxy:
相当于是star schema+多个fact table
可以存储arregate之后的结果
4 Fact table 与dimension attribute
在fact table中要避免dimension table 的FK为null
these nulls would automatically cause a referential integrity violation
在fact table中measure 的值可以为空
fact table有以下几种形式:
transaction fact tables
periodic snapshot fact table
accumulating snapshot fact table
factless fact table
aggregate fact table
consolidated fact table
Role-playing dimension:a dimension that participates several times in a fact table
意思就是某个dimension table 里面有多个FK,这些FK均可以连接到同一个Fact Table里。fact Table有多个FK可以指向同一个表
在dimension table中要避免简单的Y/N,最好写上具体意思
5. SCD
当我们需要改变属于OLAP的表格时,我们需要update数据。在DW中一般有以下几种方式:
type1: overwrite,直接覆盖旧数据
type2: with version
add column (effective,expiration,indicator)
insert the new value
我们新加入一行,这一行数据的surrogate key是不同的,但是natural key是与原数据一致,同时加入3列,用来指明该数据生效和失效的日期,并指明现在正在使用的数据对象的状态是effective还是expire
type3: with version
replace the old one,add a column(last version)
在这里我们将新加入一列用来指明之前的旧数据
6.query in DW
当我们实际在DW进行query查询操作时,以oracle为例:
with clause to do the recursive query:可以支持递归查询,第一行用来init 数据,union all之后的部分可以当作不断递归扩展的部分
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
rollup(a,b): (a,b),(a),() 属于group by的一部分,数据将会有(a,b),(a),()三个层次的区别。最后一个即对所有total层次的统计
cube(a,b):(a,b),(a),(b),()类似与rollup,但是增加了对b对象支持
grouping sets:可以讲想要的维度对象加入到其中
grouping(balba): 1 when the value is null, else 0 可以用来检测现在的层次的状态,归根结底还是为了避免出现null的情况做出的努力
grouping_ID(a,b,c): use the binary to store the situation. 当有多个元素时,grouping_ID出现的将会是以二进制的形式。 以a b c为例,1 0 0即当a层次为null,将会显示6
Group_ID: whether it is replicated or not and how many times it shows
显示数据重复次数
in the window function:
when the window function is a aggregated function then it must need group by operation
window function over(partition by.. [order by ...]):值得注意的是,当window function是arrogate的时候,一定需要加上group by( partition的对象)
rank() over (partition by.. order by ...): 从小(1)到大; 若有desc则是从大(1)到小排序,注意此时的order by是必须的,很好理解,没有order就没办法进行rank了
DenseRank():不允许出现rank排名有跳过的现象(1 2 2 3 4)
window function over(...... [row 2 preceding]):向上看2行
window function over(...... [range condition]):向上看logic offset
LAG(expression, offset, default_value): 对每行数据进行expression中的操作,并利用offset中距离向上看,如果向上看的对象不存在则用default value代替
LEAD:一样,换成向下看
7. Partition
divide data (table, index) into pieces that can be manipulated independently.
partition的好处:
allows to handle very large relation
allows to parallelism
filter the partition when query optimisation
ez to maintenance
这是在物理的层面做优化要考虑的
何时考虑采用partition:
table size >2G more than 1M rows
historical data read only
multi media storages
partition主要分成两种 vertical partition horizontal partition。
horizontal partition主要分成以下三种基本类(它们可以自由组合): hash, range, list
Hash:
好处: balance the partition, on non-temporal attribute, distribute the data on the physical storage
怎么选择hash时的对象:choose the column that is almost unique
怎么选择hash的值:take the power of 2 as number
in the partition wise join
Update:
DISABLE/ENABLE ROW MOVEMENT
row movement disabled (default): update fails if it would result in row migration
Enable row movement: updating the key may cause a row to move to another partition
Range
MAX VALUE can be used to specify the top range, otherwise: implicit integrity constraint on the table.
LIST:
Does not support multi-column partition keys.
Interval partitioning:
first by range
then use interval(...):
必须要明确定义第一行数据
Partition by reference:
PARTITIONBYREFERENCE(sales_item_fk)
-- requires named referential constraint toward partitioned table
Partitioning on virtual column
The other operation possible:
ADD
DROP: the fast way to remove large volume data, delete the index first, otherwise it will degrade the performance
TRUNCATE: only delete the row data, the partition remains
SPLIT
MERGE
Partition exchange
Partition pruning:
RANGE, LISTIN, =, LIKE, range (<,. . . )
HASH IN, =
Partition-wise joins:
Parallelism within a query (principle):split the query in multiple subqueries over distinct parts of the data; process subqueries in parallel.
full: partition key on both table with the same (#partition in hash)
partial: (table 1 has the partition key, table 2 will (re)partitioned based on the reference table partition.)
8.Index
B-tree
B+-tree: 在range queries中效率比较高
B树和B+树的主要区别在于:B-tree could store the data in the node, in the B+ only the leaves could store the data
一个小例子:
imagine if there is table with k attribute and n rows
then use B+ tree will be need 64*k*n
bitmap是适合DW的一种索引方式
create a bitmap for the attribute
它的好处在于,good at the boolean operation,节省空间不需要存储ROW ID可以fit 在main memory
in that case it will be 3*k*n(3 is the coordinate of attribute k)
bitmap on join 只需要找到相同的join key再对相应的对象进行建立bitmap就可以了
STAR QUERY是非常快的,因为它先join需要有选择(select)操作的对象,再join无法select的大对象
在使用时必须要:STAR_TRANSFORMATION_ENABLED = true.
when using the star query, it need all the fk in based on bitmap
in the clustered-index:
Creating an index-organized table:
ORGANIZATION INDEX 指明这是index organized的情况
MAPPING TABLE // creates a table mapping logical rowids-- the mapping table is necessary to support bitmap indexes
Multidimensional clusting中也分为两种:
linear order
there is also something like interleaved order: 意味着以Z字形进行存储数据,例如对坐标(2,1,0)对象进行建立索引时将会为(100010)2=34
cluster的建立可以减少IO操作,无须像index那么的存储空间,可以提高压缩的程度
9. Bloom filter
to decide whether the element is in the table or not
Array A: mbit
Hash function
1.map(element in S) using the several hash function into A
2. A[h(s)]=0 then it doesn't in the S
else it is possible
improve the accuracy, A has more bits, making more hash functions..
10.Column-oriented DB
merge the dictionary, sorted it
replace the old one using the new dictionary to replace.
After the merge,
different buffer is empty but with the valid vector as 1