数据仓库ETL工具箱——提交事实表(一)

事实表装有企业的度量数据,每一个度量都是被模型化到事实表中的一条记录。度量是指:通过工具或比例等级可以测量观察的数量值。事实表包含度量,维度表包含关于度量的上下文,这种关于事务的简单试图是最终用户直观理解数据仓库的方式。

每一个事实表通过表的粒度来定义。事实表的粒度是事件度量的定义。粒度的定义必须按照现实的,物理的度量意义来定义,然后才考虑维度和事实表中的其它字段等其它因素。所有的事实表包含了一组关联到维表的外键,而这些维表提供了事实表度量的上下文。大多数的事实表还包括了一个或者多个称为事实的数值型的度量字段。某些事实表中还包含了一个或多个退化维。每个事实表都包含一组由表中的字段定义的主键,事实表中必须有主键。

在维度模型中,参照完整性意味着事实表中的每个字段使用的是合法的外键,可能有两种情况会导致违反参照完整性:

1.加载包含了错误外键的事实表记录

2.删除了维表记录,而其主键在事实表中被使用

在ETL过程中可以保证参照完整性的三个主要位置如下图:

数据仓库ETL工具箱——提交事实表(一)

  1. 在将事实数据加载到最终表之前,仔细的审核和准备数据,在删除任何维表记录之前,仔细的审核
  2. 在每次事实表插入操作和每次维表删除操作动作发生时,使用数据库自己的参照完整性检查
  3. 加载后对事实表进行扫描检查,以发现和更正有问题的外键,解决参照完整性冲突。

从实践的角度来讲,第一个选择更加可行。在数据加载到事实表中最后一步就是查找事实表中的自然外键,然后将他们替换成维表中的代理键;第二种选择利用数据库的参照完整性来检查的方法虽然很自然,但是在批量加载成千上万条甚至几百万条记录的时候效率太低;第三种在数据库更新完成后检查参照完整性的方法在理论上可以发现所有的冲突,但是花费的代价很高。

代理键管道

在建立事实表时,最终的ETL步骤是将新数据记录的自然键转化成正确的、当期的代理键。维表在插入或者缓慢变化维2更新发生之后,在处理事实表之前,这个维表必须被完全的更新。在更新事实表之前的维表更新过程是维护维表和事实表参照一致性的一般过程。

数据仓库ETL工具箱——提交事实表(一) 从新增事实表记录中获得每个自然键键值,然后替换成对应的当期代理键。如果每天加载的数据量不大,并且装在窗口很大,可以定义事实表和维表的星型联结,将自然键转化成代理键,用SQL处理整个过程。

由于在源系统中有可能没有参照完整性检查,这样对事实表记录进行代理键处理的时候要考虑处理一些无效的自然键。书中建议在这种情况下创建一个新的代理键,增加一条维表记录,标示为Unknown。如果无法对数据最终更正,那么每个无效的自然键都应该给一个唯一的新的代理键。如果业务本身要求这些无效的自然键必须保持并且不被处理,那么在所有收到影响的维度中都需要有一个单个的唯一代理键。

事实表可以归入三种基础类型:交易粒度、周期快照和聚合快照。

交易粒度表示的是在特定时间、空间点上的一次瞬间的测量。交易粒度事实表是三种类型事实表中最大和最详细。由于单个的交易往往带有时间戳,交易粒度的事实表通常用于复杂和分析。由于交易粒度事实表具有不可预测的数据分布,前端应用不能在查询中假定任何主键集。这个问题可以通过指定一个事实无关的覆盖表,该表中存储了所有有意义的键的组合,以便确保应用能够匹配指标。

在理想的环境中,同代的交易级别事实表记录是通过一个固定的时间间隔大批量的抽取到数据仓库中。

周期快照事实表表现得是一个时间段,或者规律性的重复。这类表非常适合跟踪长期的过程。在周期快照事实表中的日期维度是周期。所以,对于月度周期快照的日期维度是日历月的维度。周期快照事实表可以完全知道数据的分布。发布给最终用户应用使用的事实表可以预测数据分布,但是原始的源表却不能,需要将周期快照事实表的主要维度和原始的源表进行外连接来确保为每种合理的键组合生成记录。

聚合快照事实表用于描述那些有明确开始和结束的过程。聚合快照不适合长期连续的处理,聚合快照表的粒度是一个实体从其创建到当前状态的完整的历史。聚合快照事实表有几个特殊的属性,最明显的是大量的日历日期外键。所有的聚合快照事实表都拥有一组日期,按照表的标准模式来创建。在聚合快照事实表中的记录当事件发生的时候会被重写。

在装在事实表之前,要做好索引管理、分区管理、覆盖回滚日志、装在数据、增量装载、插入事实、消除事实、更新事实、删除事实等操作。

索引对于查询来说可以提升性能,但是在数据加载的时候起到的却是相反的作用,使用了大量索引的表有可能导致处理变得非常缓慢。在开始加载数据以前,在前置任务中需要删除所有的索引,然后在后置任务中重建所有的索引。按照以下步骤来避免索引导致的ETL处理瓶颈:

  1. 从要插入的记录中分离那些需要执行更新操作的记录
  2. 删除那些更新操作不需要的索引
  3. 加载那些需要更新的记录
  4. 删除剩余的索引
  5. 通过批量加载方式执行数据插入
  6. 重建所有的索引

 为了管理或者提高查询性能,使用分区技术将数据库表在物理上分为一些小的表。表分区可以极大的提高对大事实表的查询性能。表分区对于最终用户是透明的。

最常用的事实表分区策略是按照日期字段来分区的。原因是日期维度是预加载和静态的,可以明确的知道代理键。由于用户通常会使用基于日期维度的限定,需要使用关联到日期维度的事实表主键进行分区。

通过在日志中记录每一个事务,系统可以从未提交的事务错误中恢复,当错误发生的时候数据库访问日志,撤销任何尚未提交的事务。在数据仓库中,所有的事务都是由ETL过程管理的,回滚日志仅仅是为了获得优化的加载性能增加的额外的特性,数据仓库不需要回滚日志的原因如下:

  • 所有的数据通过受ETL系统管理的进程输入
  • 数据批量的加载
  • 如果加载过程失败,数据可以很容易的重新加载

以上为提交事实表的部分内容,下一篇会详细介绍数据装在部分。