1. Truncate-Load 全量加载
简单直观、不易出错,适合数据量不太大的操作
性能问题
2. Increamental-Load 只考虑新增、修改、删除的记录
良好的数据源设计(主要是标识列)可能直接就给后续的增量处理提供了最直接的判断依据
1) 只有insert操作
表中的数据是不可逆的比如删除或者修改,一般会提供一列能够记载这条记录生成时间或者ID增长的列
处理策略:第一次加载动作完成之后,记录一下最大的时间点,保存到一个加载记录表中;
从第二次加载开始先比较上次操作保存的最后/最大的时间点,只加载这个时间点以后的数据;
当加载过程全部成功完成之后再更新加载记录表,更新这次最后的时间点。
2) 有修改时间特征的表
创建时会用CreateDate标记,更新的时候用UpdateDate标记,当CreateDate和UpdateDate相同的时候说明这一条数据是插入操作
处理策略:第一次加载动作完成以后,记录一下最大的 UpdateDate 时间戳,保存到一个加载记录表中
在第二次加载数据的时候,用加载记录表中的时间戳与源表里的 UpdateDate 相比较,比时间戳大的说明是新添加的或者修改的数据
当整个加载过程成功之后,更新最大的 UpdateDate到记录表中
如果插入数据的时候只会写入 CreateDate,但是并不会写入UpdateDate,这样的话在每次加载的过程中可能就需要同时比较CreateDate和UpdateDate了
UpdateDate is null--表示new insert和not update的数据,UpdateDate is not null--表示new update和old update的数据(需要用一张表记录最大的createDate和UpdateDate的时间)
3) 编辑信息无时间ID特征的表
表本身只保留基本信息,所有的编辑操作等信息专门有一张表来记录,单独记载所有的编辑历史信息。这种表好处是主要信息独立,查询主表时查询体积小而提高查询效率。
处理策略:要关联 Member Audit History 表并进行时间戳或者自增长ID的判断,参照1)和2)的设计方案
4) 无特征数据表
没有明显的update、insert标识列
处理的策略:基于主键或者唯一列到目标表中查询是否存在,不存在就插入,如果存在就比较关键列数据是否相等,不相等就修改
考虑使用SQL Merge或者SSIS的Lookup + Conditional Split实现
--merge MERGE INTO @TargetTable AS T USING @SourceTable AS S ON T.ID = S.ID WHEN MATCHED THEN UPDATE SET T.DSPT = S.DSPT WHEN NOT MATCHED BY TARGET THEN INSERT VALUES(S.ID, S.DSPT) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $ACTION AS ACTION, Deleted.ID AS 'Deleted ID', Deleted.DSPT AS 'Deleted Description', Inserted.ID AS 'Inserted ID', Inserted.DSPT AS 'Inserted Description' INTO @Log;
3. Source---Staging---PROD
source-->staging: 主要是增量数据处理
staging表可以全清空,再从数据源中加载
fact表考虑使用增量,保证在 Staging 事实中的数据相对于后面的PROD数据库来说就是新增的或者已修改过的数据
staging-->PROD: 主要是Dim和Fact的ETL处理
维度SCD过程,事实表的Lookup过程
4. 加载失败的情况的应对
1) SSIS过程处理日志和错误日志
在SSIS Package执行的时候,写执行过程到processLog中,ExecutionStatus和eventHandler的信息
2) 设置checkpoint,跳过上一次已经成功执行过一些步骤而直接从失败的地方重新开始执行
启用checkPoint--空白处右键-属性,设置saveCheckPoint=true;
checkPointUsage=IfExists; 如果检查文件不存在将从头开始执行 CheckpointUsage=Always检查文件将必须存在
checkpointFileName=filepath; 一个包将只有一个检查文件
最后在包的各种task上都设置checkPoint,并将FailPackageOnFailure设置为true
Checkpoint只支持到Control Flow Task这一层,而不会支持Data Flow这一层; 循环组件,检查点不会记录循环中的状态
如果设置TransactionOption = Required的话,将不允许使用 Checkpoints 这一机制
3) CheckPoint执行过程解析--http://www.cnblogs.com/biwork/p/3366724.html