28 Ocak 2016 Perşembe

ODI Interface'lerinde çalışma süresiyle ilgili performans iyileştirmeleri

Merhabalar,

Bir önceki yazımda ODI Uygulama Performans İyileştirme calısmasına ek olarak ,du yazımdada ODI üzerinden yapılan geliştirmelerde yaşanılan performans sorunlarının tespit edilmesi ve diğer yapılabilecek iyileştirmelerden sizlere bahsetmek istedim.

1> ODI Interface'lerinde çalışma süresiyle ilgili performans iyileştirmeleri için öncelikle yavaş çalışan interface ler 3. maddedeki query lerle ODI respository'den bulunmalıdır.Bu işlemden sonra, ODI paketlerine bölünerek paralellik işlemleri ile veya Yeni geliştirilecek ODI Knowledge Module'leriyle performans iyileştirmesi yapılabilir.

Örneğin IKM Incremental Update KM dışında IKM Delete Insert KM ile Update yapılan işlemleri azaltarak performans iyileştirmesi


2> ODI KM  lerde Database verisyonuna bağlı yapılacak iyileştirmeler.
ODI KM lerde yapılacak ilk iyileştirme ara tablolara NOLOGGING ve PARALLEL, /*+APPEND*/ ile yapılacak iyileştirmelerdir. Bunlar yapıldıktan sonra Exadata veya Database versiyonuna bağlı olarak yapılacak iyileştirmeleri uygulayabiliriz.
Örneğin Exadata'da Compress for Query High, Compress for Query Low değişiklikleri yapıldıktan sonra, Tablolara Optimum 8 paralellik verilmeli, Tabloların büyüklüğüne size'ına baplı olarak bu paralellikler artırılabilir.


3>Performansı düşük ODI interface'lerini tespit etmek için,

create table long_running_interfaces as
select pop_name,avg(step_dur) step_dur
from 
(select distinct pop.pop_name,log.step_dur 
from 
       odiw.snp_pop pop,
       odiw.snp_sess_step sess,
       odiw.snp_step_log log
where  
    pop.pop_name = sess.step_name
    and sess.sess_no = log.sess_no
    and sess.nno = log.nno
    and STEP_BEG between to_date(20150325,'yyyymmdd') and  to_date(20150330,'yyyymmdd'))
    group by pop_name


create table long_running_interfaces2 as
select pop_name,avg(step_dur) step_dur
from 
(select distinct pop.pop_name,log.step_dur 
from 
       odiw.snp_po pop,
       odiw.snp_sess_step sess,
       odiw.snp_step_log log
where  
    pop.pop_name = sess.step_name
    and sess.sess_no = log.sess_no
    and sess.nno = log.nno
    and STEP_BEG between to_date(20150325,'yyyymmdd') and  to_date(20150330,'yyyymmdd'))
    group by pop_name 

select * from long_running_interfaces order by step_dur desc

select * from long_running_interfaces2 order by step_dur desc


select SS.SESS_NAME, ST.TASK_NAME3, S.NNO, S.SCEN_TASK_NO, sum(S.TASK_DUR) from 
    ODIW.SNP_SESS_TASK_LOG S, 
    ODIW.SNP_SESS_TASK ST,
    ODIW.SNP_SESSION SS
WHERE
    S.SESS_NO = ST.SESS_NO AND
    S.NNO = ST.NNO AND
    S.SCEN_TASK_NO = ST.SCEN_TASK_NO AND
    S.SESS_NO = SS.SESS_NO  AND
    S.TASK_BEG >= TRUNC(SYSDATE) - 1
GROUP BY SS.SESS_NAME, ST.TASK_NAME3,ST.TASK_NAME3,S.NNO,S.SCEN_TASK_NO
ORDER BY 5 DESC NULLS LAST


---- bakilacak
select ST.TASK_NAME1,ST.TASK_NAME3,sum(S.TASK_DUR) from 
    ODIW.SNP_SESS_TASK_LOG S, 
    ODIW.SNP_SESS_TASK ST
WHERE
    S.SESS_NO = ST.SESS_NO AND
    S.NNO = ST.NNO AND
    S.SCEN_TASK_NO = ST.SCEN_TASK_NO AND
    S.TASK_BEG >= TRUNC(SYSDATE) - 1
GROUP BY ST.TASK_NAME1,ST.TASK_NAME3
ORDER BY 3 DESC NULLS LAST

-- bakilacak
select SESS_NAME, SUM(SESS_DUR) from ODIW.SNP_SESSION 
WHERE
      SESS_BEG >= TRUNC(SYSDATE) - 1
GROUP BY SESS_NAME
ORDER BY 2 DESC NULLS LAST

---- bakilacak
select ST.TASK_NAME2,sum(S.TASK_DUR) from 
    ODIW.SNP_SESS_TASK_LOG S, 
    ODIW.SNP_SESS_TASK ST
WHERE
    S.SESS_NO = ST.SESS_NO AND
    S.NNO = ST.NNO AND
    S.SCEN_TASK_NO = ST.SCEN_TASK_NO AND
    S.TASK_BEG >= TRUNC(SYSDATE) - 1
GROUP BY ST.TASK_NAME2
ORDER BY 2 DESC NULLS LAST


select S.TASK_DUR,ST.*  from 
    ODIP.SNP_SESS_TASK_LOG S, 
    ODIP.SNP_SESS_TASK ST
WHERE
    S.SESS_NO = ST.SESS_NO AND
    S.NNO = ST.NNO AND
    S.SCEN_TASK_NO = ST.SCEN_TASK_NO AND
    S.TASK_BEG >= TRUNC(SYSDATE) - 1 AND
    ST.TASK_NAME2 = 'CC_EOD_FSUM_EOC_REDISCOUNT_SUMMARY_ALL'
ORDER BY 2 DESC NULLS LAST


---- interface getting all warning list
-----------------------------------------------------------
SELECT DISTINCT PROJECT_NAME, POP_NAME, POP_TYPE
           FROM (SELECT DISTINCT p.PROJECT_NAME, f.FOLDER_NAME, a.POP_NAME,
           CASE
                WHEN a.WSTAGE='E' THEN 'NORMAL_POP_1'
                ELSE 'TEMP_POP_1' END   AS pop_TYPE,
                                 e.COL_NAME source_col_name,
                                 e.SOURCE_DT source_data_type,
                                 CASE
                                    WHEN e.SOURCE_DT = 'DATE'THEN 7
                                    ELSE e.LONGC
                                 END source_prec,
                                 CASE
                                    WHEN e.SOURCE_DT != 'NUMBER' THEN 0
                                    ELSE e.SCALEC
                                 END source_scale,
                                 b.COL_NAME target_col_name,
                                 b.SOURCE_DT target_data_type,
                                 CASE
                                    WHEN b.SOURCE_DT = 'DATE' THEN 7
                                    WHEN (    b.SOURCE_DT = 'NUMBER' AND b.LONGC = 0) THEN 38
                                    ELSE b.LONGC 
                                 END target_prec,
                                 b.SCALEC target_scale
                            FROM SNP_PROJECT p,
                                 SNP_FOLDER f,
                                 SNP_POP a,
                                 SNP_POP_COL b,
                                 SNP_POP_MAPPING c,
                                 SNP_TXT_CROSSR d,
                                 SNP_TXT_HEADER m,
                                 SNP_COL e
                           WHERE (1 = 1)
                             AND p.i_project = f.i_project
                             AND f.i_folder = a.i_folder
                             AND a.i_pop = b.i_pop
                             AND b.i_pop_col = c.i_pop_col
                             AND c.i_txt_map = d.i_txt
                             AND d.i_txt = m.i_txt
                             AND d.i_col = e.i_col
                             AND INSTR (SUBSTR (UPPER (m.full_text), 0, 100),'CASE') = 0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '(') = 0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '||') =0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '<%') =0
                             AND b.SOURCE_DT IS NOT NULL
                 UNION ALL
                 SELECT DISTINCT p.PROJECT_NAME, f.FOLDER_NAME, a.POP_NAME,
                 CASE
                    WHEN a.WSTAGE='E' THEN 'NORMAL_POP_2'
                    ELSE 'TEMP_POP_2' END   AS pop_TYPE,
                                 e.COL_NAME source_col_name,
                                 e.SOURCE_DT source_data_type,
                                 CASE
                                    WHEN e.SOURCE_DT = 'DATE' THEN 7
                                    ELSE e.LONGC
                                 END source_prec,
                                 CASE
                                    WHEN e.SOURCE_DT != 'NUMBER' THEN 0
                                    ELSE e.SCALEC
                                 END source_scale,
                                 t.COL_NAME target_col_name,
                                 t.SOURCE_DT target_data_type,
                                 CASE
                                    WHEN t.SOURCE_DT = 'DATE' THEN 7
                                    WHEN (    t.SOURCE_DT = 'NUMBER' AND t.LONGC = 0) THEN 38
                                    ELSE t.LONGC
                                 END target_prec,
                                 t.SCALEC target_scale
                            FROM SNP_PROJECT p,
                                 SNP_FOLDER f,
                                 SNP_POP a,
                                 SNP_POP_COL b,
                                 SNP_COL t,
                                 SNP_POP_MAPPING c,
                                 SNP_TXT_CROSSR d,
                                 SNP_TXT_HEADER m,
                                 SNP_COL e
                           WHERE (1 = 1)
                             AND p.i_project = f.i_project
                             AND f.i_folder = a.i_folder
                             AND a.i_pop = b.i_pop
                             AND b.i_col = t.i_col
                             AND b.i_pop_col = c.i_pop_col
                             AND c.i_txt_map = d.i_txt
                             AND d.i_txt = m.i_txt
                             AND d.i_col = e.i_col
                             AND INSTR (SUBSTR (UPPER (m.full_text), 0, 100),'CASE') = 0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '(') = 0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '||') =0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '<%') =0
                             AND b.SOURCE_DT IS NULL
                 UNION ALL
                 SELECT DISTINCT p.PROJECT_NAME, f.FOLDER_NAME, a.POP_NAME,
                 CASE
                    WHEN a.WSTAGE='E' THEN 'NORMAL_POP_3'
                    ELSE 'TEMP_POP_3' END   AS pop_TYPE,
                                 x.COL_NAME source_col_name,
                                 x.SOURCE_DT source_data_type,
                                 CASE
                                    WHEN x.SOURCE_DT = 'DATE' THEN 7
                                    ELSE x.LONGC
                                 END source_prec,
                                 CASE
                                    WHEN x.SOURCE_DT != 'NUMBER' THEN 0
                                    ELSE x.SCALEC
                                 END source_scale,
                                 t.COL_NAME target_col_name,
                                 t.SOURCE_DT target_data_type,
                                 CASE
                                    WHEN t.SOURCE_DT = 'DATE' THEN 7
                                    WHEN (    t.SOURCE_DT = 'NUMBER' AND t.LONGC = 0) THEN 38
                                    ELSE t.LONGC
                                 END target_prec,
                                 t.SCALEC target_scale
                            FROM SNP_PROJECT p,
                                 SNP_FOLDER f,
                                 SNP_POP a,
                                 SNP_POP_COL b,
                                 SNP_COL t,
                                 SNP_POP_MAPPING c,
                                 SNP_TXT_CROSSR d,
                                 SNP_TXT_HEADER m,
                                 SNP_POP_COL x
                           WHERE (1 = 1)
                             AND p.i_project = f.i_project
                             AND f.i_folder = a.i_folder
                             AND a.i_pop = b.i_pop
                             AND b.i_col = t.i_col
                             AND b.i_pop_col = c.i_pop_col
                             AND c.i_txt_map = d.i_txt
                             AND d.i_txt = m.i_txt
                             AND d.i_pop_col = x.i_pop_col
                             AND INSTR (SUBSTR (UPPER (m.full_text), 0, 100),'CASE') = 0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '(') = 0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '||') =0
                             AND INSTR (SUBSTR (m.full_text, 0, 100), '<%') =0
                             AND b.SOURCE_DT IS NULL
                             AND d.i_col IS NULL)
          WHERE (1 = 1)
          AND (SOURCE_PREC > TARGET_PREC OR SOURCE_SCALE > TARGET_SCALE)
-- AND POP_NAME='COG_LOCATION_INFO_07.1'
ORDER BY PROJECT_NAME, POP_NAME, POP_TYPE



  --- error handling
SELECT 
    CAST(A.SESS_NO ||' -> '|| SESS_NAME||' -> '|| STEP_NAME || ' -> ' ||
    CASE
    WHEN STEP_TYPE='F' THEN 'INTERFACE'
    WHEN STEP_TYPE='VD' THEN 'VARAIBLE DECLARATION'
    WHEN STEP_TYPE='VS' THEN 'SET/INCREMENT VARAIBLE'
    WHEN STEP_TYPE='VE' THEN 'EVALUATE VARIABLE'
    WHEN STEP_TYPE='V' THEN 'REFRESH VARIABLE'
    WHEN STEP_TYPE='T' THEN 'PROCEDURE'
    WHEN STEP_TYPE='OE' THEN 'OS COMMAND'
    WHEN STEP_TYPE='SE' THEN 'ODI TOOL'
    WHEN STEP_TYPE='RM' THEN 'REVERSE ENGINEERING MODEL'
    WHEN STEP_TYPE='CM' THEN 'CHECK MODEL'
    WHEN STEP_TYPE='CS' THEN 'CHECK SUB MODEL'
    WHEN STEP_TYPE='CD' THEN 'CHECK DATA STORE'
    WHEN STEP_TYPE='JM' THEN 'JOURNALIZE MODEL'
    WHEN STEP_TYPE='JD' THEN 'JOURNALIZE DATA STORE'
    END || ' -> ' ||
    SUBSTR(A.ERROR_MESSAGE,1, 3500) AS VARCHAR2(4000))
FROM
            <%=odiRef.getObjectName("SNP_SESS_TASK_LOG")%>  a ,
            <%=odiRef.getObjectName("SNP_SESSION")%>        t,
            <%=odiRef.getObjectName("SNP_SESS_STEP")%>      p
WHERE
  TRUNC(A.TASK_BEG) = TRUNC(SYSDATE)
  AND A.TASK_STATUS = 'E'
  AND A.SESS_NO =T.SESS_NO
  AND T.CONTEXT_CODE='<%=odiRef.getContext( "CTX_CODE" )%>'
  AND A.SESS_NO = P.SESS_NO
  AND A.NNO = P.NNO
  AND A.SESS_NO ='<%=odiRef.getSession("SESS_NO")%>'


-- SQL QUERY FOR SEARCHING KEYWORD IN FILTER-JOIN-MAPPING

SELECT DISTINCT POP.POP_NAME, POP.I_POP, 'FILTER-JOIN' AS TYPE,TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) ASTXT  FROM ODIWCRS.SNP_POP POP,ODIWCRS.SNP_POP_COL COL,ODIWCRS.SNP_POP_MAPPING MAP,ODIWCRS.snp_pop_clause CLS
,ODIWCRS.snp_txt_header HDR
WHERE POP.I_POP=col.i_pop(+)
AND COL.I_POP_COL=MAP.I_POP_COL(+)
AND MAP.I_DATA_SET=CLS.I_DATA_SET(+)
AND CLS.I_TXT_SQL=HDR.I_TXT(+)
AND  hdr.i_txt_orig=124
AND (TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2008%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2009%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2010%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2011%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2012%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2013%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2014%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2015%'
)
UNION ALL
SELECT DISTINCT POP.POP_NAME, POP.I_POP,'MAPPING' AS TYPE,TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) AS TXT   FROM ODIWCRS.SNP_POP POP,ODIWCRS.SNP_POP_COL COL,ODIWCRS.SNP_POP_MAPPING MAP
,ODIWCRS.snp_txt_header HDR
WHERE POP.I_POP=col.i_pop(+)
AND COL.I_POP_COL=MAP.I_POP_COL(+)
AND MAP.I_TXT_MAP=HDR.I_TXT(+)
AND  hdr.i_txt_orig=130
AND (TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2008%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2009%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2010%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2011%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2012%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2013%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2014%' OR
TO_CHAR(SUBSTR(HDR.FULL_TEXT,1,1000)) LIKE '%2015%'
);

ODI Uygulama Performans Çalışması [IDE Configurations]


Merhabalar,

    ODI ile development yapan herkesin sorun yasadığı uygulama üzerindeki performans sorununa dair etkisi hissedilir bir configürasyon calışmasını sizlerle paylaşmak isterim.

     1>> Öncelikle ODI'nin versiyonları arasında bir performans değerlendirmesine gidersek , ODI 11.1.1.5 ODI'ın en yavaş versiyonu,  ODI 11.1.1.6  daha hızlı, ODI 11.1.1.7 versiyonu ise gerek gelen extended knowledge module'ler (SAP Connector vs), gerekse hız olarak en optimum, en iyi olan versiyondur.Bu sebeble, ODI kullanıcılarına ilk tavsiyem performans için ilk olarak ODI11.1.1.7 kurulumu yapılmalıdır.


      Bunun için öncelikle Java kurulumu yapılmalıdır. Bundan dolayı JDK 1.6.0_35 versiyonunu kurduk. Kurulumla ilgili ekran görüntüleri aşağıdadır, Burada önemli olan nokta default versiyon yerine (c:\Program Files\Jdk1.6.0_35 yerine Program Files'daki boşluk sorunuyla uğraşmamak için C:\jdk1.6.0_35 olarak kurulum directory sini değiştirip kurulumu yapıyoruz)


     Java Kurulumu tamamlandıktan sonra 64 bit odi windows client kurulumu için, Download ettiğimiz ODI 11.1.1.7  (ofm_odi_generic_11.1.1.7) için Disk1\Install\Win64\Setup.exe dosyasını tıklıyarak kurulumu başlatıyoruz, aşağıdaki ekran görüntülenir.Ekranda kurulu java dizinini sormaktadır, Buraya C:\Jdk.1.6.0_35 giriyoruz.

           
  
Kurulumu başlatması için 1 dk ya kadar bekliyoruz ve aşağıdaki kurulum ekranı görüntüleniyor.


Kurulum için gerekli olan girilmesi sonrası son olarak aşağıdaki ekranda "Install" diyerek kurulumu sonlandırıyoruz.



2>> ODI 11.1.1.7 kurulumu yaptıktan sonra IDE performansını artırmak için default ODI ayarlarını değiştirmemiz gerekiyor.

Bunun için Kurulu ODI dizinine gidip \oracledi\client\ide\bin\ide.conf dosyasına gidip aşağıdaki ayarları değiştiyoruz.

DEFAULT AYARLAR
----------------------------------
AddVMOption  -Xmx640M
AddVMOption  -Xms128M

GÜNCELLENMİŞ  AYARLAR
----------------------------------------------------
AddVMOption  -Xmx1024M
AddVMOption  -Xms640M

Bunun dışında yine IDE performansını artırmak için Kurulu ODI dizinine gidip \oracledi\client\odi\bin\odi.conf dosyasında aşağıdaki ayarları değiştiriyoruz.

Bu dosyadaki 
AddVMOption -XX:MaxPermSize=256M ayarını
AddVMOption -XX:MaxPermSize=768M olarak değiştirebiliriz.

Not: Bu ayarları yaptıktan sonra ayarlarının devrede olabilimesi için tümüyle ODI dan çıkıp, tekrar girmemiz gerekmektedir.



ODI 11.1.1.7 kurulumu ve IDE ayarlarıyla ilgili değişiklikleri yaptıktan sonra, sonraki iyileştirme ise, ODI Work Repository'nin kurulu olduğu schema'daki tablolarda yapılan iyileştirmelerdir.

Aşağıdaki tablolara eklenen index'leri Mapping işlemlerini daha hızlı yapmamızı ve veritabanından mapping bilgilerinin daha hızlı gelmesini sağlayacaktır.

--- Aşağıdaki indexler  ODI11.1.1.5 ve ODI11.1.1.6 sürümünde gelmediği için bu index lerin yaratılması gerekmektedir.
CREATE UNIQUE INDEX INDX_I_TXT_SQL ON ODIW.SNP_POP_CLAUSE(I_TXT_SQL);

CREATE UNIQUE INDEX INDX_I_TXT_MAP ON
ODIW.SNP_POP_MAPPING(I_TXT_MAP);

--- Aşağıdaki index ODI 11.1.1.5 te yoktu, ODI 11.1.1.6 da olabilir, kontrol ettikten sonra yoka yaratıyoruz.

CREATE  INDEX INDX_I_TXT ON ODIW.SNP_TXT_CROSSR(I_TXT);

Yapılan bu configurasyon değişikleri sonrası uygulama seviyesinde daha rahat ve hızlı reaksiyonlar alıyor olacaksınız.