2016-05-15 57 views
2

由於性能問題,我有要求在Informatica中爲大型表構建持久緩存。我的要求是隻有當表中有一些變化時才建立這個緩存(數據庫是oracle)。在我的情況表中,每週/每月更新一次數據。僅在表中更新數據時重建Informatica永久緩存

我想知道如何informtica會明白表中有一些變化,它需要現在重建緩存。有沒有優雅的方法來實現這一目標?

我能想到的一種方法是,每次查找表更新時都會創建一個帶有查找表數據的平面文件。使用平面文件作爲查找。 現在,在我的情況下,通過Informatica可以加載查找表。如果在informatica之外更新,該怎麼辦?

謝謝

回答

2

enter image description here

在這個例子中,我使用的源表emp_location在查詢,您的樣品臺。緩存文件也以emp_location*開頭。

我在您的主會話之前創建了2個虛擬會話。

  1. 創建一個運行表,並保存最後一次運行時間。

    select * 
    from run_history 
    where process_name='EMP_DIM' 
    
    +--------------+----------------------+ 
    | PROCESS_NAME | LAST_READ_TIME | 
    +--------------+----------------------+ 
    | EMP_DIM  | 15-MAY-2016 12:00:07 | 
    +--------------+----------------------+ 
    

    在主會話的會話前任務中,使用類似這樣的內容。

    update run_history 
    set last_read_time = sysdate 
    where process_name='EMP_DIM'; 
    

現在找到的時候,你的表進行了更新。如果表沒有update time列,請使用它獲取表的最新更新時間。

select scn_to_timestamp(max(ora_rowscn)) 
from emp_location; 

現在是第一個虛擬會話,使用此查詢。如果last_read_time之後源表中有更新,它將返回1行。如果不是,那麼它將返回0行。

select 1 from dual 
where 
    (select scn_to_timestamp(max(ora_rowscn)) 
     from emp_location) 
> 
    (select last_read_time 
     from run_history 
     where process_name='EMP_DIM') 
  • 在鏈接任務,把作爲條件,$s_check_last_update.TgtSuccessRows=1

    所以下一次會議只會在真正發生變化時纔會運行。在其post_session_task中運行清除緩存文件的命令。

    Windows:del $PMCacheDir\emp_location* Unix:rm -rf $PMCacheDir\emp_location*

  • 此鏈接任務都會有類似情況。 IIF($s_check_last_update.TgtSuccessRows=1,0,1)

  • 在主會話中,打開General選項卡並使用Treat Input links as OR

    現在,集成服務將重新創建新的緩存文件,如果它們被刪除。

  • 或者,您也可以通過外殼/ bash腳本,將連接到Oracle和檢查,如果有什麼東西在表更新,最後讀取時間後達到同樣的事情。如果屬實,它應該刪除緩存文件。

    +0

    我還沒試過這個,但我認爲這會給出所需的輸出。 –