简单的存储过程.检查表的每一个字段的count.

create or replace procedure test(ownername in varchar2,tablename in varchar2) is
type vref is ref cursor;
cur_col_cnt vref;
col_name varchar2(50);
sqltext varchar2(200);
colname varchar2(50);
cnt varchar2(50);
cursor cur_colname is
  select COLUMN_NAME from all_tab_columns where owner=ownername AND TABLE_NAME=tablename;
begin
open cur_colname;
loop
  fetch cur_colname into col_name;
  exit when cur_colname%notfound;
  sqltext:=’select ‘||col_name||’, count(1) from ‘||ownername||’.’||tablename||’ group by ‘||col_name;
  dbms_output.put_line(sqltext);
   open cur_col_cnt for sqltext;
   loop
     fetch cur_col_cnt into colname,cnt ;
     exit when cur_col_cnt%notfound;
     dbms_output.put_line(colname||’:’||cnt);
   end loop;
   close cur_col_cnt;
  
end loop;
close cur_colname;
end test;

informatica性能调优小结

使用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;