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;
低效: select * from table1 where name='zhangsan' and tID > 10000
高效: select * from table1 where tID > 10000 and name='zhangsan'
如果 tID 是一个聚合索引,那么后一句仅仅从表的 10000 条以后的记录中查找就行了;而
前一句则要先从全表 中 查 找看有几 个 name='zhangsan' 的,而后 再 根 据限制条 件 条 件
tID>10000 来提出查询结果。
(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)是一个较好的方案,但该类型索引的缺点是只
评论1