如何从优化SQL入手提高数据仓库的ETL效率

稳定运行的以Microsoft Azure SQL database数据库为数据源和目标的ETL性能变差时提高性能方法和步骤 在以为数据源和目标的 ETL(Extract, Transform, Load)过程中,性能问题可能会随着数据量的增加、查询复杂度的提升或系统负载的加重而逐渐变差。提高以 Microsoft Azure SQL Database 为数据源和目标的 ETL 性能需要综合考虑数据库查询优化、数据加载策略、并行处理、资源管理等方面。通过合适的索引、查询优化、批量处理、增量加载和数据库资源配置,可以显著提升 ETL 流程的性能。定期监控性能并根据负载情况进行调整,也是确保系统稳定运行的关键。 阅读详情
如何从优化SQL入手提高数据仓库的ETL效率
2006-12-28 16:17

作者:周四阳 蔡自兴

1        引言
      数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。

目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业务数据,这些信息系统中的数据需要通过搭建数据仓库平台才能得到科学的分析,这也是近几年数据仓库系统建设成为IT领域热门话题的原因。

2        优化的思路分析

    数据仓库ETL过程的主要特点是:面对海量的数据进行抽取;分时段对大批量数据进行删除、更新和插入操作;面对异常的数据进行规则化的清洗;大量的分析模型重算工作;有特定的过程处理时间规律性,一般整个ETL过程需要在每天的零点开始到6点之前完成。所以,针对ETL过程的优化主要是结合数据仓库自身的特点,抓住需要优化的主要方面,针对不同的情况从如何采用高效的SQL入手来进行。
        优化的实例分析

   目前数据仓库建设中的后台数据库大部分采用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)

        /* ODS_CUSTOMER为数据源表;DIM_CUSTOMER为维表*/
(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表空间里。 同时确保数据表空间和索引表空间置与不同的硬盘控制卡控制的硬盘上。

4        结论

   随着数据仓库系统应用需求的急剧增长,参与和关注这方面的人员将越来越多。文章中主要依据本人4年多的数据仓库实施经验,同时结合ETL的过程原理和数据仓库建设的方法论,归纳总结了以上优化的方案,愿此文能在同行中起到抛砖引玉的作用。

 
ETL基础概念及要求详解 ETL即Extract(抽取)Transform(转换)Load(装载)的过程,如下图,同时也包括数据清洗的部分,是数据从源端到目标端的一个数据处理的过程,是构建数据仓库的重要一环,但不局限于构建数据仓库其他BI(商业智能)的设计和开发数据分析平台也经常用到ETL。 阅读详情

相关推荐

ETL的过程原理及数据仓库建设

一、 数据仓库建设 数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。 目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业务数据,这些信息系统中的数据需要通过搭建数据仓库平台才能得到科学的分析,这也是近几年数据仓库系统建设成为IT领域热门话题的原因。 二、优化的思路分析 数据仓库ETL

Colin_lqk的博客 2195

SQL优化工作, 不能太激动。记录失败的优化经历,优化从 70分钟优化到 30秒, 再到1s但还是失败了

今天思前想后还是把一次失败的优化 经历写下来吧,  防止以后再犯同样的错误。   以后谨记教训。 哎, 其实还差一点就到达我想要的效果了。   update   st_mntr_bus_inteorder_oc    a   set a.unreach = 1      where arch_flag = 0        and parent_tache_id = 2017

daiqiulong2的博客 463

基于mediapipe的动作捕捉和人物模型的驱动

我实习做这个的时候,当时也找了很多资料,但很多资料都没有讲透,下面我就总结一下自己结合看代码后的感悟,还有一些我认为很重要的点。

qq_58484580的博客 7702

如何从优化SQL入手提高数据仓库的ETL效率(转载)

1        引言数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。 目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业务数据,这些信息系统中的数据需要通过搭建数据...

weixin_33802505的博客 412

DELL服务器BIOS下配置RAID阵列

dell服务器配置raid阵列

weixin_58250887的博客 1万+

手把手教你用STM32F103实现CAN总线双机通信(基于CubeMX+HAL库)

本文详细介绍了基于STM32F103和STM32CubeMX工具实现CAN总线双机通信的完整流程。文章重点解析了CAN总线在嵌入式物联网应用中的优势,并深入讲解了波特率计算、过滤器配置、接收中断处理等关键细节,提供了实用的代码框架和可靠传输方案,帮助开发者规避常见陷阱,构建稳定的工业级通信系统。

weixin_29193259的博客 479

etl会占用oracle游标吗,如何从优化SQL入手提高数据仓库的ETL效率[以Oracle为例]

1 引言数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业务数据,这些信息系统中的数据需要通过搭建数据仓库平台才能得到科学的...

weixin_39634900的博客 142

IC验证 AHB-RAM 项目(二)——接口与事务代码的编写

本文介绍了准备工作及接口、事务相关代码编写要点。在接口部分,重点说明了lvc_ahb_if.sv、rkv_ahbram_if.sv和rkv_ahbram_tb.sv三个关键文件的功能,其中rkv_ahbram_if.sv通过动态任务实现复位信号控制。事务部分则涉及lvc_ahb_types.sv中的枚举类型定义和lvc_ahb_transaction.sv中的随机化变量设置,用于构建AHB传输激励。整个验证环境采用模块化设计,通过接口实现TB与DUT的通信,为后续验证工作奠定基础。

weixin_45926435的博客 405

从如何优化SQL入手,提高数据仓库的ETL效率

1 引言数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。 目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业务数据,这些信息系统中的数据需要通过搭建数据仓库平...

weixin_30741653的博客 72

C++中为什么要引入引用变量?

C++引用机制的设计哲学在于平衡性能与安全性。它解决了指针的三个痛点:语法噪音、空指针风险和语义模糊,同时保持了指针的效率优势。引用必须绑定有效对象且不可重绑定的特性增强了安全性,其值语义语法更直观。尤其在运算符重载和const引用场景中,引用展现了不可替代的优势。本质上,引用是编译器优化的指针实现,体现了C++"零开销抽象"的核心思想——既保持底层性能,又提供高级抽象。这种设计允许开发者根据场景灵活选择指针或引用,反映了C++多范式共存的语言智慧。

教学 & 技术专栏 175

【若依(ruoyi)】BootstrapTable列宽定制实战:突破width属性限制的两种方案

本文针对若依(RuoYi)框架中BootstrapTable组件列宽设置失效的常见问题,提供了两种实战解决方案。通过CSS样式覆盖法强制定义列宽,或利用formatter函数进行动态HTML包裹,有效突破width属性限制,实现精准的表格列宽定制。

weixin_29013129的博客 174

优化SQL入手提高数据仓库的ETL效率

作者:周四阳 蔡自兴 1 引言 数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。 目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验,积累了大量可分析的业...

weixin_33919950的博客 112

【五分钟论文笔记】Vision Banana:图像生成器成为通用视觉学习器

图像生成训练可以像 LLM 预训练一样,让模型学习强大且通用的视觉表示感知即生成——将视觉任务输出参数化为 RGB 图像,是一种优雅且强大的统一框架视觉理解能力可以在不牺牲生成能力的情况下获得——两者可以共存于同一个模型。

专注:太空算力、AI infra、异构调度、大模型成本工程 232

转贴:如何从优化SQL入手提高数据仓库的ETL效率 作者:周四阳 蔡自兴

如何从优化SQL入手提高数据仓库的ETL效率 作者:周四阳 蔡自兴1 引言 数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。 目前,国内的大中型企业基本都具有四年以上计算机信息系统应用经验...

weixin_30364147的博客 134

在 ABAP 环境中创建 Job Catalog Entry 和 Job Template 的完整实践指南

摘要:本文介绍了SAP BTP ABAP环境中Application Job的云原生解决方案,对比传统后台作业模式。重点阐述了Job Catalog Entry和Job Template两大核心概念,通过库存重估业务场景演示如何实现可调度类、创建Job Catalog Entry及Job Template。文章详细说明了从ABAP类到Job Catalog Entry再到Job Template的完整链路,并分享实际项目中的设计经验和注意事项,帮助开发者将传统后台作业迁移到Application Job框架

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 232

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: Microsoft SQL Server 2005的分析服务 搭建数据仓库
下一篇: 用SQL Server 2005构建数据仓库(二)
Reasoncool
博客等级 码龄21年 16粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值