由于性能问题,我需要在 Informatica 中为大型表构建持久缓存。我的要求是仅当表中有一些更改时才构建此缓存(数据库是oracle)。就我而言,表每周/每月更新数据。
我试图弄清楚 informtica 如何理解表中存在一些变化,并且现在需要重建缓存。有什么优雅的方法来实现这一点吗?
我能想到的一种方法是,每次更新查找表时创建一个包含查找表数据的平面文件。使用平面文件作为查找。 现在,在我的情况下这是可能的,因为查找表是通过 Informatica 加载的。如果它在 informatica 外部更新怎么办?
谢谢
最佳答案
在此示例中,我在查询中使用源表 emp_location
作为示例表。此外,缓存文件以 emp_location*
开头。
我在您的主 session 之前创建了 2 个虚拟 session 。
创建一个运行表,并在其中保存最后一次 session 运行时间。
select * from run_history where process_name='EMP_DIM' +--------------+----------------------+ | PROCESS_NAME | LAST_READ_TIME | +--------------+----------------------+ | EMP_DIM | 15-MAY-2016 12:00:07 | +--------------+----------------------+
在主 session 的 session 前任务中,使用类似的内容。
update run_history set last_read_time = sysdate where process_name='EMP_DIM';
现在查一下时间,您的表格已更新。如果表没有更新时间
列,请使用它来获取表的最新更新时间。
select scn_to_timestamp(max(ora_rowscn))
from emp_location;
现在是第一个虚拟 session ,请使用此查询。如果在 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
。因此,只有在发生真正的更改时才会运行下一个 session 。在其
post_session_task
中运行命令来清除缓存文件。Windows:
del $PMCacheDir\emp_location*
Unix:
rm -rf $PMCacheDir\emp_location*
此链接任务将具有如下条件。
IIF($s_check_last_update.TgtSuccessRows=1,0,1)
。在主 session 中,打开
常规
选项卡并使用将输入链接视为 OR
。现在,如果删除了新的缓存文件,集成服务将重新创建它们。
或者,您可以通过 shell/bash 脚本实现相同的目的,该脚本将连接到 Oracle 并检查上次读取时间后表中是否更新了某些内容。如果为真,它应该删除缓存文件。
关于oracle - 仅当表中的数据更新时才重建 Informatica 持久缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234416/