15 Şubat 2016 Pazartesi

Oracle Data Integrator 12c new Features Overview

Merhaba,

Bu yazımda Cloud teknoloji ile hayatımıza giren Oracle 12c ile kullanıcılara sunulan Oracle Data Integrator 12c nin getirdiği yeni özelliklerinden bahsetmeye çalışağım.


1.Techical Setup

Öncelikle ,uygulama arayüzündeki logo ve start_page 'de yapılan değişiklik daha oturaklı ve keyifli olmus.



     İl bakışta , Uygulamanın BIGDATA entegrasyonlarına dair eklentileri ile dikkat çektiğini söylemek mümkün.

  •  Sqoop Integration 
  •  HBase Integration 
  •  Hive Append Optimization
  •  HDFS access in Oracle Data Integrator
  •  Enhanced Hive Driver and Knowledge Modules

    BIG DATA tarafındaki entegrasyonlar hariçinde günlük development'larımızda sürekli karsılacagımız bir çok alandada güzel geliştirmeler yapılmıs.

1 >Mapping & Resuable Mappings

     Uygulamanın acılması ve ilgili repository baglantısının gerçektirdikten sonra ilk dikkatimi çeken yenı bir proje olusturdugunuzda Designer tab'ındaki Mapping ve Reusable Mapping  tanımları oldu.


       İlk başta küçük bir isim değişikliği gibi hissettirsede aslında kendi içinde köklü güzel değişikliklere gidilmiş ki bazı değişiklikler Informatica Powercenter 'a andırmıyor değil.
      
      Reusable Mapping kavramı ise 11g de kullandıgımız Temporary Interface(Sarı Interface) lerin tam olarak karsılığı diyebiliriz.

Mapping içerinde yapılan değişikliklerden biraz bahsetmek gerekirse;

    A. SOURCE > TARGET mapping :Artık aynı canvas içerisinde artık bu planlamayı gerçekleştirebiliyoruz.

    B. New Components: Source ve Target mappinglerin yanı sıra uygulama üzerinde sağ tarafta OWB (Oracle Warehouse Builder) da önceden de kullanılmıs olan "COMPONENT" adında yeni bir panel eklenmiş ki burası developer'lar için çok kolaylaştırıcı olacaktır.



    Genel olarak baktıgımızda tüm componentlerin kullanım DRAG and DROP olarak ilerliyor ve her component IN ve OUT connector larla baglanıyor ve birden çok OUT connector bir IN connector'a bağlantılı (Many to One) calışabiliyor.
   Bu aslında başlıbaşına bir değişik ama benim en çok dikkatimi çeken SPLIT componenti oldu.


Example of DISTINCT component  (LOGICAL Tab)


                                         Example of DISTINCT component  (Physical Tab)


Example of LOOKUP component

    C. MULTI TARGET Mapping: Biraz önce COMPONENTLER arasında dikkatimi çektiğini belirttiğim SPLIT yapısı ile aynı workflow üzerinden bu component ile birden cok farklı tabloya gidilebiliyor. 
       Bu sayede, aynı kaynaktan beslenip farkı expressionlarla yada diğer işlemlerden geçerek beslenmesi gereken tabloları dağıtmadan bir mapping üzerinden bütünleşik olarak işleyebiliyor.
     Split componentini önceden baska tool larda tecrübe etmiş biri olarak (SAS DataFlux) herkese büyük kolaylık yaratacağına eminim.


                                                        Example of SPLIT component

2 >Debug & Controlling the Execution Flow : Aslında uzun zamandır bu özellik kullanıcılarca bekleniyordu. Core PL/SQL ile development yapmıs her developer DEBUG mode'da kodu çalıstırıp kontrollerini rahat ve konforlu sekilde yapmanın kıymetini bilir.
          İşte bu özellikle olusturulan variable'lardan tutun planlanmıs LOAD_PLAN ların DEBUGGER özelliği ile step by step yönetimi kullanıcılara sunulmus durumda.




     Genel olarak 12c aslında hayatımıza bu cok anlamda yenı özellikler ve kullacıya kolaylık sağlıyacak değişiklerle bizlerle buluşuyor.Bu bağlamda bazı özellikleriyle beni tatmin etti açıkcası.

Oracle Data Integrator 12c için ilk incelememde dikkatimi çeken özelliklerini sizlerle paylastım. Umarım faydalı olmustur...


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%'
);