ETL优化(转载)

1.引言
  数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。
  目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业务数据,这些信息系统中的数据需要通过搭建数据仓库平台才能得到科学的分析,这也是近几年数据仓库系统建设成为IT领域热门话题的原因。
2.优化的思路分析
  数据仓库ETL过程的主要特点是:面对海量的数据进行抽取;分时段对大批量数据进行删除、更新和插入操作;面对异常的数据进行规则化的清洗;大量的分析模型重算工作;有特定的过程处理时间规律性,一般整个ETL过程需要在每天的零点开始到6点之前完成。所以,针对ETL过程的优化主要是结合数据仓库自身的特点,抓住需要优化的主要方面,针对不同的情况从如何采用高效的SQL入手来进行。
3.优化的实例分析
  目前数据仓库建设中的后台数据库大部分采用Oracle,以下的SQL采用Oracle的语法来说明,所有的测试在Oracle9i环境中通过,但其优化的方法和原理同样适合除Oracle之外的其他数据库。
  3.1索引的正确使用
  在海量数据表中,基本每个表都有一个或多个的索引来保证高效的查询,在ETL过程中的索引需要遵循以下使用原则:
  (1) 当插入的数据为数据表中的记录数量10%以上时, 首先需要删除该表的索引来提高数据的插入效率,当数据全部插入后再建立索引。
  (2) 避免在索引列上使用函数或计算,在WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。举例:
       低效: SELECT * ROM DEPT WHERE SAL * 12 > 25000;
       高效: SELECT * FROM DEPT WHERE SAL > 25000/12;
  (3) 避免在索引列上使用NOT和”!=” , 索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到NOT和”!=”时,就会停止使用索引转而执行全表扫描。
  (4) 索引列上用>=替代>
       高效: SELECT * FROM EMP WHERE DEPTNO >=4
       低效: SELECT * FROM EMP WHERE DEPTNO >3
  两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
  (5) 函数的列启用索引方法,如果一定要对使用函数的列启用索引,Oracle9i以上版本新的功能:基于函数的索引(Function-Based Index)是一个较好的方案,但该类型索引的缺点是只能针对某个函数来建立和使用该函数。
     CREATE INDEX EMP_I ON EMP (UPPER( ENAME));
     SELECT * FROM EMP WHERE UPPER(ENAME) = ‘BLACKSNAIL’;
  3.2 游标的正确使用
  当在海量数据表中进行数据的删除、更新和插入操作时,用游标处理的效率是最慢的方式,但它在ETL过程中的使用又必不可少,而且使用有着及其重要的地位,所以游标的正确使用尤为重要。
  对数据仓库维表的数据进行维护时,因为需要保证维表ID的一致性,所以采用游标的是数据维护完整性的最好方式。由于它的效率低,如果按照普通的方式将无法处理大数据量的维表数据维护(一般是指10万条记录以上的维表),以下是处理这种情况的有效方式:
    (1) 在数据抽取的源表中使用时间戳,这样每天的维表数据维护只针对更新日期为最新时间的数据来进行,大大减少需要维护的数据记录数。
  (2) 在INSERT和UPDATE维表时都加上一个条件来过滤维表中已经存在的记录,实例为:
       INSERT INTO DIM_CUSTOMER SELECT * FROM ODS_CUSTOMER WHERE ODS_CUSTOMER.CODE NOT EXISTS (DIM_CUSTOMER.CODE)
  (3) 使用显式的游标(CURSORs) ,因为使用隐式的游标将会执行两次操作,第一次检索记录,第二次检查TOO MANY ROWS 这个EXCEPTION,而显式游标不执行第二次操作。
  3.3数据抽取和上载时的SQL优化
  3.3.1 WHERE子句中的连接顺序
      ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其它WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
      低效:SELECT * FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);
      高效:SELECT * FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER’;
  3.3.2 删除全表时用TRUNCATE替代DELETE
      当DELETE删除表中的记录时,有回滚段(rollback segments ) 用来存放可以被恢复的信息,而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息,所以执行时间也会很短。同时需要注意 。 TRUNCATE只在删除全表时适用,因为TRUNCATE是DDL而不是DML。
  3.3.3 尽量多使用COMMIT
  ETL中同一个过程的数据操作步骤很多,数据仓库采用的是数据抽取后分析模型重算的原理,所以对数据的COMMIT不像业务系统为保证数据的完整和一致性而需要某个操作过程全部完成才能进行,只要有可能就在程序中对每个DELETE、INSERT和UPDATE操作尽量多使用COMMIT, 这样系统性能会因为COMMIT所释放的资源而大大提高。
  3.3.4 用EXISTS替代IN
         在许多基于基础表的查询中,为了满足一个条件往往需要对另一个表进行联接,例如在ETL过程写数据到模型时经常需要关联10个左右的维表,在这种情况下,使用EXISTS而不用IN将提高查询的效率。
  3.3.5 用NOT EXISTS替代NOT IN
          子查询中,NOT IN子句将执行一个内部的排序和合并,无论在哪种情况下,NOT IN都是最低效的,因为它对子查询中的表执行了一个全表遍历。用NOT EXISTS替代NOT IN将提高查询的效率。
  3.3.6 优化GROUP BY
          提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉。
            低效: SELECT JOB , AVG(SAL) FROM EMP GROUP BY JOB HAVING JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’
          高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’ GROUP BY JOB
  3.3.7 有条件的使用UNION-ALL 替换UNION
  ETL过程针对多表连接操作的情况很多,有条件的使用UNION-ALL 替换UNION的前提是:所连接的各个表中无主关键字相同的记录,因为UNION ALL 将重复输出两个结果集合中相同记录。
  当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。如果用UNION ALL替代UNION,这样排序就不是必要了,效率就会因此得到提高3-5倍。
3.3.8 分离表和索引
  总是将你的表和索引建立在不同的表空间内,决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里。同时确保数据表空间和索引表空间置与不同的硬盘控制卡控制的硬盘上。

ETL

       ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析的依据。ETL是BI项目的重要的一个环节,BI项目中,通常情况下ETL会花掉整个项目的三分之一的时间,设计的好坏直接关系到BI项目的成败。

      ETL的设计三部分:数据抽取、数据的清洗转换、数据的加载、在设计ETL的时候我们也还是从这三部分出发。数据的抽取是从各个不同的数据源抽取到ODS中(这个过程中也可以做一下啊数据的清洗和转换),在抽取的过程中需要挑选不同的抽取方法,尽可能的提高ETL的运行效率、ETL三个部分中,花费的时间最长的是T(清洗、转换)的部分,一般情况下工作量是整个ETL的三分之二。数据的加载一般数据清洗完额之后直接就写入到DW中去。

     ETl的实现有很多种方法,常用的有三种,一种的借组ETL工具如O的OWB,SQL server 2000的DTS,SQLSevere2005中的SSIS服务,Informatic等实现,一种的SQL方式实现,另外一种是ETL工具和SQL相结合。前两种方法各有各的优缺点,借组工具可以快速的建立起ETL工程,屏蔽了复杂的编码任务,提高了速度降低了难度,但是缺少灵活。SQL的方法有点是灵活,提高了ETL的运行效率,但是编码复杂,对技术要求比较高。第三种是综合了前面二中的优点,会极大的提高ETL的开发速度和效率。

一、  数据的抽取

     这一部分需要在调研阶段做大量的工作,首先要搞清楚数据是从几个业务系统中来,各个业务系统的数据库服务器运行什么DBMS,是否存在手工数据,手工数据量有多大,是否存在非结构化的数据等等当手机完这些信息之后才可以进行数据抽取的设计。

1、 对于与存放DW的数据库系统相同的数据库源处理方法,这一年数源在设计比较容易,一般情况下,DBMS(SQLserver,Oracle)都会提供数据库链接的功能,在DW数据库服务器和愿业务系统之间建立直接的链接关系就可以写select语句直接访问。

2、 对于DW数据库系统不同的数据源的处理方法。

     对于这一类数据源一般情况下也可以通过ODBC的方式建立数据库链接,如SQL Server和Oracle之间。如果不能建立数据库链接,可以有两种方式完成,一种是通过将源数据,通过工具将数据导出成.txt或者是.xls文件,然后再将这些源系统文件导入到ODS中。另外一种方法通过程序接口来完成。

3、 对于文件类型数据源(.txt,.xls),可以培训业务人员利用数据库工具将这些数据导入到指定的数据库,然后从指定的数据库抽取。或者可以借助工具实现,如SSIS服务的平面数据源和平面目标等组件导入到ODS中去。

4、 增量更新的问题

     对于数据量大的系统,必须考虑增量抽取。一般情况,业务系统会记录业务发生的时间,我们可以用来坐增量的标志,没吃抽取uzhiqian首先判断记录最大的是i安,然后根据这个时间去业务系统取大于这个时间的所用的记录。利用业务系统的时间戳,一般情况下,业务系统没有或者部分有时间戳。

二、 数据清洗转换

      一般情况下,数据仓库分为ODS、DW两部分,通常的做法是从业务系统到ODS做清洗,将脏数据和不完整的数据过滤掉,再从ODS到DW的过程中转换,进行一些业务规则的计算和聚合。

1、 数据清洗

     数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后冉进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。
      A、不完整的数据,这一类数据主要是一些应该有的信息缺失,如供应商的名称,分公司的名称,客户的区域信息缺失、业务系统屮主表与明细表不能匹配等,对于这一类数据,过滤出来,按缺失的内容分别写入不同 Excel文件向客户提交,要求在规定的时间内补全。补全后才写入数据仓库。
      B、错误的数据,这类错误产生的原因是业务系统不够健全,在接收输入后没有进行判断頁接写入后台数据库造成的,比如数值数据输成全角数字字符,字符半数据后面有一个回车,日期格式不正确,日期越界等,这一类数据也要分类,对于类似于全角字符、字符串数据前后有不面见字符的问题只能写 SQL的方式找出来,然后要求客户在业务系统修正之后抽取,日期格式不正确的或者是日期越界的这一类错误会导致ETL运行夫败,这一类错误需要去业务系统数据库用SQL的方式挑出来,交给业务主管部门求限期修正,修正之后再抽取。
      C、重复的数据,对于这一类数据,特别是维表中会出现这种情况,将重复的数据的记录所有字段导出来,让客户确认并整理。
数据清洗是一个反复的过程,不可能在几天内完成,只有不断的发现问题,解决问题。对于是否过滤,是否修正一般要求客户确认,对于过滤掉的数据,写入Excel文件或者将过滤数据写入数据表,在ETL开发的初期可以每天向业务单位发送过滤数据的邮件,促使他们尽快的正错误,同时也可以作为将来验证数据的依据。数据清洗需要注意的是不要将有用的数据过滤掉了,对于每个过滤觌则认真进行验证,并要用户确认。
2、数据转换
     数据转换的任务主要进行不一致的数据转换、数据粒度的转换,一些商务规则的计算。
     A、不一致数据转换,这个过程是一个整合的过程,将不同业务系统的相同类型的数据统一,比如同一个供应商在结算系统的编码是XX0011,而在CRM中编码 是YY0001,这样在抽取过来之后统一转换成一个编码。
     B、数据粒度的转换业务系统一般存储非常明细的数据,而数据仓库中数据是用来分析的,不需要非常明细的数据,一般情况下,会将业务系统数据按照数据仓库粒度进行聚合。
     C、商务觌则的计算不同的企业有不同的业务规则,不同的数据指标,这些指标有的时候不是简单的加加减减就能完成,这个时候需在ETL屮将这些数据指标计算好了之后存储在数据仓库屮,供分析使用。
三、ETL日志、警告发送

1、ETL日志

    ETL日志分为三类,一类是执行过程日志,这一部分日志是在ETL执行过程中每执行一步的记录,记录每次运行每一步骤的起始时影响了多少行数据,流水账形式。一类是错误日志当某个模块出错的时候写错误日志记录每次出错的时出错的模块以及出错的信息等。第三类日志是总体日志,只记ETL开始时间,结束时间是否成功信息。如果使用ETL工具,ETL工具会自动产生一些日志,这一类日志也可以作ETL日志的一部分。记录日志的目的是随时可以知道ETL运行情况,如果出错了,出错在那里。
2、警告发送
     ETL出错了,不仅要与ETL出错日志而且要向系统管理员发送警告,发送警告的方式多种,一般常用的就是给系统管理员发送邮件,并附上出错的信息,方便管理员查错误。
ETL是 BI项目的关键部分,也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率史高,为项目后期开发提供准确的数据。

本文由于时间长久,来源不清,如有侵权,请联系删除。

 

 

转载于:https://www.cnblogs.com/littlewu/p/8616136.html

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值