使用informatica做ETL的时候,大表(超千万)的性能十分值得关注,每秒输出行数至少要上千在实际项目中才开始有可用性,
简单的说是下面几点
1
目标表可先禁用不必要索引,加快插入速度,一般只留下主键的unique所有就可以了.
2
源表使用过滤条件减少行数.必要的时候可分批导入.过滤条件必须要加索引.如果多个条件使用联合索引.对源表sql最好事先explain plan一下.因为oralce自动选择的索引很可能不是我们希望的最优选择,必要的在sql中加上hint .如/*+index(表名 索引名)*/来提示oracle使用我们指定的索引,这个事情在表建有多个索引的时候经常会发生
3
lookup大表的话必须使用sql override ,限制sql条件.注释掉默认的order by字句,为lookup组件设置cache size,和index cache size.一般来讲一百万左右的数据100MB的cache就可以了.index一般设为cache的一般即可,在设cache的时候好像最大只能设300MB左右.再大就会报错,而且如果lookup数据量很小的话设大缓存也会报错,如果lookup的表数据量很小最好cache不要设置超过50MB,Lookup cache persistent 一般建议选中.如果这个lookup需要执行多次.而lookup的表不变的话.这个像是根据代码去名称.或是取一个属性可大幅加快执行速度.
4
aggregator组件.joiner组件,尽量使用sorted input ,并且指定cache大小.最大设到500Mb左右.注意etl服务器是32位cpu的话一个session最大只能使用2G内存,这个2G是手工设定的cache容量加(Maximum Memory Allowed For Auto Memory Attributes和Maximum Percentage of Total Memory Allowed For Auto Memory Attributes中的较小值)
5
组件尽量服用.都设为resuable
6
选择update else insert是在update失败以后insert到数据库.在update strategy组件前先lookup目标表.确定好这条数据是update还是insert到目标表,会比更新失败再插入快,插入数据会提高5倍左右.
使用informatica计算同期往期值
在数据仓库往小集市的时候,经常要计算某一个指标的同期往期值,这个确实是不太好做.做同期往期确实让人头痛.
在多维数据库essbase中计算同期往期是非常方便.写一个计算脚本即可,essbase以一种类似指针的方式计算同期往期值,要在oracle中用sql出计算同期往期的语句也不是不可能.但是比较麻烦.倘若放在前端brio中计算那更是麻烦.开始的时候是在informatica中以lookup的方式取出某一个指标的同期往期值,事实上这个可以实现.也经过考验,但是有个缺点就是速度较慢.无数次的lookup在数据量上千万行的表中速度慢到每秒仅能处理10行数据,前几天在做几个大表.从4个表中取出数据做计算.每个表中都有四五千万行的数据,再使用lookup方式我都不敢想像性能会低到什么程度,突然有个想法,逆向来做,某年某月的指标值其实就是下个月的往期值,下年的同期值,在etl过程中写数据的时候把目标表复制3份,直接就把数据给存储到相应的时间.这样一条数据会以3个不同的时间存往3个相应的同期,往期,当期字段.经过这样改造,同期往期计算在etl中简单完成.对于千万级的表处理可达到几千条数据每秒的输出速度.基本能满足项目需要.
使用存储过程创建同义词
在给数据库建同义词的时候原来表比较少的时候还手工建.试着写个存储过程结果里面不让执行DDL语句,郁闷ing.还好找到一个变通的方法,使用execute immediate方法.
create or replace procedure xmds.xmds_set_sy(
ownername IN varchar2
) is
table_name varchar2(50):=”;
sqltext varchar2(100):=”;
cursor cur_tablename is
select TABLE_NAME from ALL_TABLES where owner=ownername;
begin
open cur_tablename;
loop
fetch cur_tablename into table_name;
exit when cur_tablename%notfound;
sqltext:=’create or replace public synonym ‘||table_name||’ for ‘||ownername||’.’||table_name;
dbms_output.put_line(sqltext) ;
execute immediate sqltext;
commit;
end loop;
close cur_tablename;
end xmds_set_sy;
国庆啦
恩.国庆啦.放假了.
刚出来工作,肯定是很苦,苦我倒是不怕,但我是希望苦后是有甜的.
来了这么几个月,大家对我工作能力的信任我很感谢,我也希望我能担任起技术带头人这么一个角色,
当然就目前来说我还欠缺很多,工作经验是一部份,恩.小廖说的对.其实一个工作上的思路是非常重要的.而且HC也说的很好.恩.有时候我的确是更需要显得有魄力一点.
接下来的几个月将是我负责ETL这个部分,10月份和小魏做第二阶段的设计工作,恩.工作很近,任务也很重,加油.dean.你会做的更好的.
这个斑马线我该怎么过?
厦门这斑马线是越来越看不懂了.在建兴路与湖滨北路的交口,原来横跨路口的斑马线给改成这样了.
大家看看这人行道我该怎么走?
走到马路中间以后……
[img][attach]1[/attach][/img]
发于小鱼论坛
http://www.xmfish.com/thread-975041-1-1.html