仅当 table 中的数据更新时才重建 Informatica 持久缓存
Rebuild Informatica persistent cache only when data is updated in the table
由于性能问题,我需要在 Informatica 中为大型 table 构建持久缓存。我的要求是仅当 table(数据库是 oracle)发生一些变化时才构建此缓存。在我的例子中 table 更新数据 weekly/monthly。
我正在尝试弄清楚 informtica 将如何理解 table 中的一些变化,它现在需要重建缓存。有什么优雅的方法可以实现这一目标吗?
我能想到的一种方法是,每次更新查找 table 时创建一个包含查找 table 数据的平面文件。使用平面文件作为查找。
现在,在我的情况下这是可能的,因为查找 table 正在通过 Informatica 加载。如果它在 informatica 之外更新怎么办?
谢谢
在此示例中,我在查询中使用源 table emp_location
,作为您的示例 table。缓存文件也以 emp_location*
.
开头
我在你的主要 session 之前创建了 2 个虚拟 session。
创建一个运行table,将最后的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';
现在找时间,你的table已经更新了。如果 table 没有 update time
列,使用它来获取 table.
的最新更新时间
select scn_to_timestamp(max(ora_rowscn))
from emp_location;
现在是第一个虚拟 session,使用这个查询。如果在 last_read_time
之后在源 table 中更新了某些内容,它将 return 1 行。如果没有,那么它将 return 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')
在 link 任务中,将条件设为 $s_check_last_update.TgtSuccessRows=1
。
所以接下来 session 只会 运行 当有真正的变化时。在其post_session_task
运行 一条命令中清除缓存文件。
Windows:
del $PMCacheDir\emp_location*
Unix:
rm -rf $PMCacheDir\emp_location*
此 link 任务的条件如下。 IIF($s_check_last_update.TgtSuccessRows=1,0,1)
。
在主 session 中,打开 General
选项卡并使用 Treat Input links as OR
。
现在集成服务将重新创建新的缓存文件,如果它们被删除。
或者,您可以通过 shell/bash 脚本实现相同的目的,该脚本将连接到 Oracle 并检查在上次读取时间后 table 中是否有更新。如果为真,它应该删除缓存文件。
由于性能问题,我需要在 Informatica 中为大型 table 构建持久缓存。我的要求是仅当 table(数据库是 oracle)发生一些变化时才构建此缓存。在我的例子中 table 更新数据 weekly/monthly。
我正在尝试弄清楚 informtica 将如何理解 table 中的一些变化,它现在需要重建缓存。有什么优雅的方法可以实现这一目标吗?
我能想到的一种方法是,每次更新查找 table 时创建一个包含查找 table 数据的平面文件。使用平面文件作为查找。 现在,在我的情况下这是可能的,因为查找 table 正在通过 Informatica 加载。如果它在 informatica 之外更新怎么办?
谢谢
在此示例中,我在查询中使用源 table emp_location
,作为您的示例 table。缓存文件也以 emp_location*
.
我在你的主要 session 之前创建了 2 个虚拟 session。
创建一个运行table,将最后的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';
现在找时间,你的table已经更新了。如果 table 没有 update time
列,使用它来获取 table.
select scn_to_timestamp(max(ora_rowscn))
from emp_location;
现在是第一个虚拟 session,使用这个查询。如果在 last_read_time
之后在源 table 中更新了某些内容,它将 return 1 行。如果没有,那么它将 return 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')
在 link 任务中,将条件设为
$s_check_last_update.TgtSuccessRows=1
。所以接下来 session 只会 运行 当有真正的变化时。在其
post_session_task
运行 一条命令中清除缓存文件。Windows:
del $PMCacheDir\emp_location*
Unix:
rm -rf $PMCacheDir\emp_location*
此 link 任务的条件如下。
IIF($s_check_last_update.TgtSuccessRows=1,0,1)
。在主 session 中,打开
General
选项卡并使用Treat Input links as OR
。现在集成服务将重新创建新的缓存文件,如果它们被删除。
或者,您可以通过 shell/bash 脚本实现相同的目的,该脚本将连接到 Oracle 并检查在上次读取时间后 table 中是否有更新。如果为真,它应该删除缓存文件。