公司网站做的好的公司,wordpress扩展class名称,上海市工程建设协会网站,农业展示网站模板下载增量抽取是数据仓库ETL(extraction#xff0c;transformation#xff0c;loading#xff0c;数据的抽取、转换和装载)实施过程中需要重点考虑的问题。在ETL过程中#xff0c;增量更新的效率和可行性是决定ETL实施成败的关键问题之一#xff0c;ETL中的增量更新机制比较复杂…增量抽取是数据仓库ETL(extractiontransformationloading数据的抽取、转换和装载)实施过程中需要重点考虑的问题。在ETL过程中增量更新的效率和可行性是决定ETL实施成败的关键问题之一ETL中的增量更新机制比较复杂采用何种机制往往取决于源数据系统的类型以及对增量更新性能的要求。
1 ETL概述
ETL包括数据的抽取、转换、加载。①数据抽取从源数据源系统抽取目的数据源系统需要的数据②数据转换将从源数据源获取的数据按照业务需求转换成目的数据源要求的形式并对错误、不一致的数据进行清洗和加工③数据加载将转换后的数据装载到目的数据源。
ETL作为构建数据仓库的一个环节负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行清洗、转换、集成最后加载到数据仓库或数据集市中成为联机分析处理、数据挖掘的基础。ETL原来主要用户构建数据仓库和商业智能项目现在也越来越多地应用于一般信息系统数据的迁移、交换和同步。
在ETL的3个环节中数据抽取直接面对各种分散、异构的数据源如何保证稳定高效的从这些数据源中提取正确的数据是ETL设计和实施过程中需要考虑的关键问题之一。
在集成端进行数据的初始化时一般需要将数据源端的全部数据装载进来这时需要进行全量抽取。全量抽取类似于数据迁移或数据复制它将数据源中的表或视图的数据全部从数据库中抽取出来再进行后续的转换和加载操作。全量抽取可以使用数据复制、导入或者备份的方式完成实现机制比较简单。全量抽取完成后后续的抽取操作只需抽取自上次抽取以来表中新增或修改的数据这就是增量抽取。
在数据库仓库中无论是全量抽取还是增量抽取抽取工作一般由数据仓库工具来完成如oracle的OWBSql Server的IntegrationServices以及专业的ETL商业产品InformaticaPowvrCenter等。如果企业的预算有限也可以考虑使用开源项目Pentaho。这些工具都有一个特点就是本身并没有实现特定的增量抽取机制它们完成全量抽取后用户可以通过定制计划任务的方式实现按一定的周期从源系统中抽取当前周期内产生的增量数据但至于这些增量数据如何产生工具并没有提供自动生成增量数据的功能。所以ETL过程中增量数据的产生机制是一个需要用户重点研究和选择的问题。
2 增量抽取机制
要实现增量抽取关键是如何准确快速的捕获变化的数据。优秀的增量抽取机制要求ETL能够将业务系统中的变化数据按一定的频率准确地捕获到同时不能对业务系统造成太大的压力影响现有业务。相对全量抽取而言增量抽取的设计更复杂有一种将全量抽取过程自动转换为增量抽取过程的ETL设计思路前提是必须捕获变化的数据增量数据抽取中常用的捕获变化数据的方法有以下几种
2.1 触发器方式
触发器方式是普遍采取的一种增量抽取机制。该方式是根据抽取要求在要被抽取的源表上建立插入、修改、删除3个触发器每当源表中的数据发生变化就被相应的触发器将变化的数据写入一个增量日志表ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据同时增量日志表中抽取过的数据要及时被标记或删除。
为了简单起见增量日志表一般不存储增量数据的所有字段信息而只是存储源表名称、更新的关键字值和更新操作类型(insert、update或delete)ETL增量抽取进程首先根据源表名称和更新的关键字值从源表中提取对应的完整记录再根据更新操作类型对目标表进行相应的处理。
例如对于源表为Oracle类型的数据库采用触发器方式进行增量数据捕获的过程如下
(1)创建增量日志表DML LOG
create table DML_LOG(
ID NUMBER primary key--自增主键
TABLE_NAME VARCHAR2(200)--源表名称
RECORD_ID NUMBER--源表增量记录的主键值
DML_TYPE CHAR(1)--增量类型I表示新增U表示更新D表示删除
EXECUTE DATE DATE --发生时间
);
(2)为DML_LOG创建一个序列SEQ_DML_LOG以便触发器写增量日志表时生成ID值。
(3)针对要监听的每一张表创建一个触发器例如对表Test创建触发器如下
Create or replace trigger T BEFORE INSERTOR UPDATE OR DELETE ON T for each row
declare I_dml_type varchar2(1);
begin
if INSERTING then l_dml type’I’;
elsif UPDATING then I_dml_type’U’;
elsif DELETING then l_dml_type’D’;
end if;
if DELETING then
insert intoDML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
values(seq_dml_log.nextval,’Test’,:old.ID,sysdate,l_dml_type);
else
insert intoDML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
values(seq_dml_log.nextval,’Test’,:new.ID,sysdate,l_dml_type);
end if;
end;
这样对表T的所有DML操作就记录在增量日志表DML_LOG中注意增量日志表中并没有完全记录增量数据本身只是记录了增量数据的来源。进行增量ETL时只需要根据增量日志表中的记录情况反查源表得到真正的增量数据。
2.2 时间戳方式
时间戳方式是指增量抽取时抽取进程通过比较系统时间与抽取源表的时间戳字段的值来决定抽取哪些数据。这种方式需要在源表上增加一个时间戳字段系统中更新修改表数据的时候同时修改时间戳字段的值。
有的数据库(例如Sql Server)的时间戳支持自动更新即表的其它字段的数据发生改变时时间戳字段的值会被自动更新为记录改变的时刻。在这种情况下进行ETL实施时就只需要在源表加上时间戳字段就可以了。对于不支持时间戳自动更新的数据库这就要求业务系统在更新业务数据时通过编程的方式手工更新时间戳字段。
使用时间戳方式可以正常捕获源表的插入和更新操作但对于删除操作则无能为力需要结合其它机制才能完成。
2.3 全表删除插入方式
全表删除插入方式是指每次抽取前先删除目标表数据抽取时全新加载数据。该方式实际上将增量抽取等同于全量抽取。对于数据量不大全量抽取的时间代价小于执行增量抽取的算法和条件代价时可以采用该方式。
2.4 全表比对方式
全表比对即在增量抽取时ETL进程逐条比较源表和目标表的记录将新增和修改的记录读取出来。
优化之后的全部比对方式是采用MD5校验码需要事先为要抽取的表建立一个结构类似的MD5临时表该临时表记录源表的主键值以及根据源表所有字段的数据计算出来的MD5校验码每次进行数据抽取时对源表和MD5临时表进行MD5校验码的比对如有不同进行update操作如目标表没有存在该主键值表示该记录还没有则进行insert操作。然后还需要对在源表中已不存在而目标表仍保留的主键值执行delete操作。
2.5 日志表方式
对于建立了业务系统的生产数据库可以在数据库中创建业务日志表当特定需要监控的业务数据发生变化时由相应的业务系统程序模块来更新维护日志表内容。增量抽取时通过读日志表数据决定加载哪些数据及如何加载。日志表的维护需要由业务系统程序用代码来完成。
2.6 系统日志分析方式
该方式通过分析数据库自身的日志来判断变化的数据。关系犁数据库系统都会将所有的DML操作存储在日志文件中以实现数据库的备份和还原功能。ETL增量抽取进程通过对数据库的日志进行分析提取对相关源表在特定时间后发生的DML操作信息就可以得知自上次抽取时刻以来该表的数据变化情况从而指导增量抽取动作。
有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMiner)使数据库日志的分析工作得到大大简化。
2.7 特定数据库的方式
针对特有数据库系统的增量抽取方式
2.7.1 Oracle改变数据捕获(changed data captureCDC)方式
OracleCDC特性是在Oraele9i数据库中引入的。CDC能够帮助识别从上次抽取之后发生变化的数据。利用CDC在对源表进行insert、update或delete等操作的同时就可以提取数据并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据然后利用数据库视图以一种可控的方式提供给ETL抽取进程作为增量抽取的依据。
CDC方式对源表数据变化情况的捕获有两种方式同步CDC和异步CDC。同步CDC使用源数据库触发器来捕获变更的数据。这种方式是实时的没有任何延迟。当DML操作提交后变更表中就产生了变更数据。异步CDC使用数据库重做日志(redolog)文件在源数据库发生变更以后才进行数据捕获。
2.7.2 Oracle闪回查询方式
Oracle9i以上版本的数据库系统提供了闪回查询机制允许用户查询过去某个时刻的数据库状态。这样抽取进程可以将源数据库的当前状态和上次抽取时刻的状态进行对比快速得出源表数据记录的变化情况。
3 比较和分析
可见ETL在进行增量抽取操作时有以上各种机制可以选择。现从兼容性、完备性、性能和侵入性4个方面对这些机制的优劣进行比较分析。
兼容性
数据抽取需要面对的源系统并不一定都是关系型数据库系统。某个ETL过程需要从若干年前的遗留系统中抽取Excel或者CSV文本数据的情形是经常发牛的。这时所有基于关系型数据库产品的增量机制都无法工作时间戳方式和全表比对方式可能有一定的利用价值在最坏的情况下只有放弃增量抽取的思路转而采用全表删除插入方式。
完备性
完备性方面时间戳方式不能捕获delete操作需要结合其它方式一起使用。
性能
增量抽取的性能因素表现在两个方面一是抽取进程本身的性能二是对源系统性能的负面影响。触发器方式、日志表方式以及系统日志分析方式由于不需要在抽取过程中执行比对步骤所以增量抽取的性能较佳。全表比对方式需要经过复杂的比对过程才能识别出更改的记录抽取性能最差。在对源系统的性能影响方面触发器方式由于是直接在源系统业务表上建立触发器同时写临时表对于频繁操作的业务系统可能会有一定的性能损失尤其是当业务表上执行批量操作时行级触发器将会对性能产生严重的影响同步CDC方式内部采用触发器的方式实现也同样存在性能影响的问题全表比对方式和日志表方式对数据源系统数据库的性能没有任何影响只是它们需要业务系统进行额外的运算和数据库操作会有少许的时间损耗时间戳方式、系统日志分析方式以及基于系统日志分析的方式(异步CDC和闪回查询)对数据库性能的影响也是非常小的。
侵入性
对数据源系统的侵入性是指业务系统是否要为实现增量抽取机制做功能修改和额外操作在这一点上时间戳方式值得特别关注。该方式除了要修改数据源系统表结构外对于不支持时间戳字段自动更新的关系型数据库产品还必须要修改业务系统的功能让它在源表t执行每次操作时都要显式的更新表的时间戳字段这在ETL实施过程中必须得到数据源系统高度的配合才能达到并且在多数情况下这种要求在数据源系统看来是比较“过分”的这也是时间戳方式无法得到广泛运用的主要原因。另外触发器方式需要在源表上建立触发器这种在某些场合中也遭到拒绝。还有一些需要建立临时表的方式例如全表比对和日志表方式。可能因为开放给ETL进程的数据库权限的限制而无法实施。同样的情况也可能发生在基于系统日志分析的方式上因为大多数的数据库产品只允许特定组的用户甚至只有DBA才能执行日志分析。闪回杏询在侵入性方面的影响是最小的。
综述:
通过对各种增量抽取机制的对比分析我们发现没有一种机制具有绝对的优势不同机制在各种因素的表现大体上都是相对平衡的。兼容性较差的机制像CDC和闪回查询机制由于充分利用了数据源系统DBMS的特性相对来说具有较好的整体优势最容易实现以及兼容性最佳的全表删除插入机制则是以牺牲抽取性能为代价的系统日志分析方式对源业务系统的功能无需作任何改变对源系统表也无需建立触发器而抽取性能也不错但有可能需要源系统开放DBA权限给ETL抽取进程并且自行分析日志系统难度较高不同数据库系统的日志格式不一致这就在一定程度上限制了它的使用范围。所以ETL实施过程中究竞选择哪种增量抽取机制要根据实际的数据源系统环境进行决策需要综合考虑源系统数据库的类型、抽取的数据量(决定对性能要求的苛刻程度)、对源业务系统和数据库的控制能力以及实现难度等各种因素甚至结合各种不同的增量机制以针对环境不同的数据源系统进行ETL实施。
4 结束语
为了实现数据仓库数据的高效更新增量抽取是ETL数据抽取过程中非常重要的一环其实现机制直接决定了ETL的整体实施效果。我们通过对几种常见的增量抽取机制进行了对比总结了各种机制的特性并分析了它们的优劣。各种增量抽取机制都有它有存在的价值和固有的限制条件在ETL的设计和实施工作过程中只能依据项目的实际环境进行综合考虑甚至需要对可采用的多种机制进行实际的测试才能确定一个最优的增量抽取方法。