传统数据仓库项目的优化手段 (针对 Oracle+DataStage )

普通手段

分区,HASH-JOIN,数据仓库函数,物化视图,位图索引等等为大伙在数据仓库常用的技术,

而下面列举的tips为项目中常用的优化手段/技巧,绿色背景highlight的部分属于非常规手段,使用场景较为极端,需谨慎考量。

Oracle并行场景:
  • SQL*Loader 的parallel参数
  • 事务失败回滚的并行处理 FAST_START_PARALLEL_ROLLBACK参数
  • expdp设置parallelism参数,设置多个datapump文件
  • 大批量处理+并行处理(parallel),减少select次数,逻辑清晰,尽可能一次select……jion 之后再进行统一分析函数的处理,

    select

    /*+ PARALLEL(Table_Name,并行数) */

    统计函数 sum avg

    case when then else end

    over(partition by order by )

    分析函数 lead/lag,rank,ratio_to_report,Period-over-period comparisons 等等...

    from

    Table_Name

    group by
    rollup ,cube 等等...

  • 创建索引、rebuild、设置并行参数(譬如大批量ETL全量时,drop索引,ETL之后再create)
  • 收集统计信息的 degree参数
  • 还有aleter session enable parallel dml;
       insert /*+ append parallel(Table_I,并行数) */
         into Table_I nologging 
           select /*+ PARALLEL(A,并行数) PARALLEL(B,并行数) PARALLEL(C,并行数) */ 
           ……
nologging 在DML时往往很有用

 

Insert、update

Insert ,update,delete 场景
1、当然最快的仍然是create table NEW_TAB  as select * from OLD_TAB

2、delete的时候如果数据量过大,可以权衡考虑全量导出建立:

CREATE TABLE NEW_TAB NOLOGGING PARALLEL as select * from OLD_TAB where 条件<>要delete的数据,再truncate原表,rename重命名新表。

update也可以同理,把update的思路写到select里面再truncate原表,rename新表。

MERGE:(同样可以使用并行,nologging

减少扫描表的次数,替代insert then update语句

例如:每月计算生产库里的会计科目成本,放入数据仓库的事实表,但有少部分的冲销凭证会影响近几个月的操作。原本的total delete+insert,或是insert新数据+时间范围内update的操作,换为merge where 时间覆盖可能发生冲销的范围即可。

参数:

1、

alter session set workarea_size_policy=manual;

alter session set sort_area_size=107341824;

alter session set sort_area_retained_size=107341824;

alter session set db_file_multiblock_read_count=128;

在并行dml、并行select的ETL JOB里可以添加如上参数,10g版本似乎要重复两次才可以生效。

db_file_multiblock_read_count配合32k、16k的大block表空间使用,针对传统SATA盘,FC盘有效,增加单次IO的收益。

同理,有时候反范式冗余多维度与事实表到一块,组成长表,db_file_multiblock_read_count+32K/16K大block的性能也很好,但数据的适用场景就减少了,多数用于临时主题分析,数据集市。

2、

修改参数 _smm_auto_min_io_size 、smm_auto_max_io_size

增大每次hash join 的内存分配大小,提升group by性能,配合大PGA使用。

3、极端环境下(或测试环境,或是同步数据的非关键过渡库),打开参数 alter system set commit_write=‘batch,nowait‘; (10gR2开始才有的特性)使得db在commit的时候,无需等待 LOG BUFFER写出到REDO LOGFILE,即返回commit完成,需要评估灾难时断电带来的风险,如有UPS可考虑打开。

注意:极端环境是指频繁的commit带来的log file sync等待成为瓶颈点的时候才考虑,才考虑!打开参数,多数情况下数据仓库不会有这个问题。

再极端一些,还可以把Online Redo文件加大至1~2G甚至更大,关闭归档,减少日志切换带来的等待,本条需要权衡场景,勿在生产环境随意使用。

外部表
  • 不能dml,不能建索引,不支持分区
  • 适合只使用一次,无需修改,方便load入数据,可以并行查询,可以Nested_Loop JOIN,可以HASH_JOIN
  • 外部表结合MERGE的场景
系统级临时表(无DML锁,无REDO)

TRANSACTION级

SESSION级

direct path insert

 

物化视图:空间换取时间

 

表空间迁移

可以传输分区表的分区,属于物理文件级别的传输,不同于SQL级别,属于最高性能,适用于跨地区的分库、子库汇总至中心库的场景。

 

DataStage方面的处理
1、Bulk load方式

读端:设置 enable partitioned reads ,modulus方式分区读取integer(zeile)

写端:oracle connect 选择bulk load方式

在bulk load写入前把所有索引,主键等drop掉。结束后再重建。

DataStage主机在多CPU的情况下,推荐设置多个并行node进行ETL作业,轻松将IO压到极限。

Before SQL Statement

After SQL Statement

Node的设置

多Node并行的效果如下图:

如果在瓶颈在Datastage的Node上

(可以测试下,node的文件建立在linux的tmpfs,即/dev/shm/tmp来提速,避免在ETL过程中数据经过datastage主机的磁盘,增加io瓶颈点,主机的内存要足够大,如64G,需测试!)

# mkdir /dev/shm/tmp

# chmod -R 777 /dev/shm/tmp

# mount --bind /dev/shm/tmp /tmp

像这样就可以直接用/tmp 来做node文件存放使用。

考虑限制用量的情况也可以用 # mount tmpfs /tmp -t tmpfs -o size=512m

限制/tmp挂载的tmpfs只能用512m

同理,大内存主机下Oracle的 temp表空间也可以往这里放,前提是temp表空间的使用情况已经平稳,DBA能预估使用的波动范围,并且关掉自动增长。需严格测试!

时间: 2024-10-12 11:56:20

传统数据仓库项目的优化手段 (针对 Oracle+DataStage )的相关文章

传统数据仓库的优化手段 (针对 Oracle+DataStage )

普通手段 分区,HASH-JOIN,数据仓库函数,物化视图,位图索引等等为大伙在数据仓库常用的技术, 而下面列举的tips为项目中常用的优化手段/技巧,绿色背景highlight起来的部分为非常规手段,使用场景较为极端,需谨慎考量. Oracle并行场景: SQL*Loader 的parallel参数 事务失败回滚的并行处理 FAST_START_PARALLEL_ROLLBACK参数 expdp设置parallelism参数,设置多个datapump文件 大批量处理+并行处理(parallel

用HAWQ轻松取代传统数据仓库(八) —— 大表分区

一.HAWQ中的分区表        与大多数关系数据库一样,HAWQ也支持分区表.这里所说的分区表是指HAWQ的内部分区表,外部分区表在后面"外部数据"篇讨论.在数据仓库应用中,事实表通常有非常多的记录,分区可以将这样的大表在逻辑上分为小的.更易管理的数据片段.HAWQ的优化器支持分区消除以提高查询性能.只要查询条件中可以使用分区键作为过滤条件,那么HAWQ只需要扫描满足查询条件的分区,而不必进行全表扫描.        分区并不改变表数据在segment间的物理分布.表的分布是物理

用HAWQ轻松取代传统数据仓库(十一) —— 数据管理

一.基本操作1. INSERT        在常用的增删改查数据库操作中,HAWQ仅支持INSERT和SELECT两种,不支持UPDATE和DELETE,这主要是因为HDFS是一个只能追加数据而不能更新的文件系统.SELECT语句最熟悉不过,它应该是数据库中最常用的语句了,在下一篇"查询优化"时再进一步讨论.INSERT语句用于创建表行,该命令需要表名和表中每个列的值.在HAWQ中,该命令有四种用法,其中三种是SQL中的常规用法,另一种是对标准SQL的扩展.(1)指定列名与列值   

解DBA之惑:数据库承载能力评估及优化手段

作为DBA,有时会被挑战类似这样的问题: 如果现有业务规模增加10倍.100倍,数据库是否能够支撑? 下个月我们搞大促,数据库这边没问题吧? 计划进行去O工作,代码逻辑不变,数据库从Oracle切换到MySQL,MySQL能支撑业务吗? 服务器采购选型,到底哪款服务器更适合我们呢? 面对诸如上面的这些质疑,DBA应该如何面对? 身为DBA该如何评估现有资源使用情况? 如果现有数据库资源确实无法支撑,又该本着什么原则进行改造呢? 本文是针对上面问题的一些经验总结,供大家参考. 一.评估工作 面对这

NetSuite针对ORACLE发布双层结构ERP

全球化公司可通过NetSuite的云ERP运营其子公司,却保持总部对Oracle投入,NetSuite提供SuiteCloud连接用于NetSuite的云ERP与全球化公司的Oracle的整合. 加州,旧金山和圣马特奥-2012年10月2日-Oracle Open World -NetSuite公司(NYSE:N),业界领先的云计算的财务/ EPR软件套件的供应商,今天NetSuite发布针对Oracle的双层结构ERP系统,得益于一个新版的NetSuite OneWorld和SuiteClou

用HAWQ轻松取代传统数据仓库(十二) —— 查询优化

即便对SELECT等数据库查询语句已经很熟悉了,但HAWQ里的查询有其自己的特点,还是需要研究一下. 一.HAWQ的查询处理流程        理解HAWQ的查询处理过程有助于写出更加优化的查询.与任何其它数据库管理系统类似,HAWQ也有如下的查询执行步骤: 用户使用客户端应用(如psql)连接到HAWQ master主机上的数据库实例,并向系统提交SQL语句. master接收到查询后,由查询编译器解析提交的SQL语句,并将生成的查询解析树递交给给查询优化器. 查询优化器根据查询的磁盘I/O.

android加载速度优化,通过项目的优化过程分析

通过这么长时间的盒子开发以及之前手机项目的经验,总体感觉两种不同设备还是有很多不同的地方的,首先一点不同的就是,手机项目和电视项目默认启动页面加载速度有重要区别 对于手机:手机加载网络数据,由于屏幕小,如果主页有网络图片的情况下,基本都是显示默认图片,这也是由于网速的限制,更重要的是手机上基本是图文混排,用户没看到图片可能焦点就在文本上了. 对于电视:如果应用首页加载使用默认图,会感觉特别丑,因为屏幕大,重要信息都是图片,如果没有图片,那用户看到的都是空白,用户的焦点没有了,只有等待和抱怨. 因

主要针对Oracle DBA在成长阶段的定位

主要针对Oracle DBA在成长阶段的定位,学习方法等几大方面进行了经典的论述,详细内容请参考下文. 一.定位 Oracle分两大块,一块是开发,一块是管理.开发主要是写写存储过程.触发器什么的,还有就是用Oracle的Develop工具做form.有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭J; 管理则需要对oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验.

mysql explain 及常见优化手段

在工作中如果遇到慢sql通常都可以用explain进行解析. 先列一下各个列名以及含义 列名 描述 id 在一个大的查询中每一个查询关键字都对应一个id select type select关键字对应的那个查询类型 table 表名 partitions(*) 分配的分区信息 type 针对单表的访问方法 possible_keys 可能用到的索引 key 实际上使用的索引 key len 实际用到的索引长度 ref 当索引列等值查询时,与索引列进行等值匹配的对象信息 rows 预估的需要读取的