【问题标题】:Rebuild Informatica persistent cache only when data is updated in the table仅在表中更新数据时重建 Informatica 持久缓存
【发布时间】:2016-09-11 02:12:09
【问题描述】:
由于性能问题,我需要在 Informatica 中为大型表构建持久缓存。我的要求是仅在表中有一些更改(数据库是 oracle)时才构建此缓存。在我的情况下,表每周/每月更新数据。
我试图弄清楚informtica 将如何理解表中有一些变化并且它现在需要重建缓存。有什么优雅的方法可以实现这一点吗?
我能想到的一种方法是,每次更新查找表时创建一个包含查找表数据的平面文件。使用平面文件作为查找。
现在,这在我的情况下是可能的,因为查找表是通过 Informatica 加载的。如果它在 informatica 之外得到更新怎么办?
谢谢
【问题讨论】:
标签:
oracle
etl
informatica
informatica-powercenter
【解决方案1】:
在此示例中,我在查询中使用源表 emp_location 作为您的示例表。缓存文件也以emp_location*开头。
在您的主要会话之前,我创建了 2 个虚拟会话。
-
创建一个运行表,并在其中保存上次会话运行时间。
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。
现在集成服务将重新创建新的缓存文件,如果它们被删除。
或者,您可以通过 shell/bash 脚本来实现相同的目的,该脚本将连接到 Oracle 并检查表中是否在上次读取时间后更新了某些内容。如果为真,它应该删除缓存文件。