STEVEN NELSON 欢迎访问 INFORMATICA 群:2791138
感谢您的阅读,希望得到您的反馈意见 第 1 页 共 11 页
INFORMATICA 调优要点(中级)
原作者:Dan Linstedt
翻译:内森(informatica@126.com
)
创建时间:2004-12-22
最后修改时间:2004-12-22
相关文档链接:http://imeanit.blogchina.com
STEVEN NELSON 欢迎访问 INFORMATICA 群:2791138
感谢您的阅读,希望得到您的反馈意见 第 2 页 共 11 页
说明
z 本文在不经过修改的基础上可以自由发布,但不得用于商业用途,
译者保留中文翻译版权
z 本着理解至上的原则,本文对于难于直译的部分,采用意译的方
法,请读者注意,如有必要,请参阅后面的原文
z 由于译者能力所限,对原文部分语句理解可能存在误解(尤其是
红色所标识部分),欢迎指正。对于有重要贡献的读者,将在文
档后的鸣谢中列出,以示感谢。
STEVEN NELSON 欢迎访问 INFORMATICA 群:2791138
感谢您的阅读,希望得到您的反馈意见 第 3 页 共 11 页
译文
如下的项目是针对 INFORMATICA 调优的中级技巧。如果使用本系列文档的初级调优
技巧后仍然遇到性能方面的问题,可以使用本文档中的相关技巧。这些技巧可以使得
MAPPING 的性能有很大程度的提升(我们已经对 INFORMATICA 做了很多的性能测试来
验证这一点)。需要注意的是,本文档中的技巧对于 100 万条记录(平均 2.5G 的数据量)左
右的记录集才有显著的效果。所有的技巧都是针对 INFORMATICA 的 MAPPING 及其对象,
并不包括其他的部分。这些技巧适用于 POWERMART/POWERCENTER
(4.5X/4.6X/1.5X/1.6X)的版本,其他的版本没有经过测试,同时这些技巧的先后于速度的
快慢之间并没有关系,每个技巧都对整个 MAPPING 的性能有影响。再次申明,MAPPING
中的对象的数量会对运行的整体速度有所影响。
有时候为了提高速度,可以牺牲一些 MAPPING 的可读性。以前的范例告诉我们,需要
在速度和可读性、可维护性(模块化)之间进行权衡。确认你的客户认可这种方法,或者数
据量非常的大必须用这种方法。注意:如下的这些技巧包括了很小的清洁和你能采取的最后
的提高的手段,只有在数据量非常大的情况再使用这些技巧,如果不是,采用那些初级的调
优技巧,然后再使用这些技巧。
为了理解本文档中的这些技巧,需要回顾一下内存使用图(在这个网站里面也有说明。
译注:目前不清楚所指为哪个网站)。
1、过滤表达式。试着对 EXPRESSION 的端口进行评估。尝试在 EXPRESSION 计算
FILTER 控件所需要的结果(真/假)。复杂的过滤表达式会使 MAPPING 变慢。表达式和条
件在 EXPRESSION 中的计算是最快的。其结果是:条件越多、越复杂,速度的降低就严重。
把实际的表达式(无论复杂与否)放在作为 FILTER 的输入流的 EXPRESSION 控件中,计
算出一个数值的标志:1 代表真、0 代表假,将这个结果输出到 FILTER 中,你能够观察到
这样的配置所带来的最大的性能。
2、去掉所有的“缺省”表达式。包括“ERROR(XXX)”在内的任何默认值都会降低运
行速度,它会给 MAPPING 中的每个数据元素带来不必要默认值的计算。唯一的例外就是你
必须为一个特定的端口设定某个默认值,这种情况下也有另一个解决方法:在 EXPRESSION
中添加一个 IIF(XXXX,DEFAULT VALUE XXXX)的变量。这样做总是比设定一个默认值的
速度要快(如果是对于 OUTPUT 端口来讲)。
3、变量端口比输出端口要慢,减少变量端口的使用。变量对“静态并且是状态相关”
的情况是比较好的,但是会增加处理时间,因为对经过 EXPRESSION 控件的每条记录都要
进行分配/重新分配的操作。
4、在 EXPRESSION 控件进行数据类型转换。直接将一个字符串映射为一个整数没有
什么问题,反之亦然,但是,在 EXPRESSION 中利用 TO_INTEGER(XXXX)函数将字符串
转换为整数或者将一个整数映射为另一个整数会更快一些。因为(在进行直接的转换时)
PMSERVER 会被等待判断这个转换是否能够被进行,这样速度就被降低了。
5、去掉没有使用的端口。令人感到吃惊的是,没有使用的输出端口对于性能没有什么
影响。这是一件好事。然而,一般来讲,删除那些在 MAPPING 没有使用的端口(包括变量)
是一个好习惯。不过,没有什么快速的方法来判定哪些是没有用处的端口。
6、字符串函数。很显然,字符串函数的使用对性能有影响,尤其是那些改变字符串的
长度的函数,例如 SUBSTRING,LTRIM,RTIME 等等。这些函数能够很大程度上的降低
MAPPING 的运行速度,因为在这些函数的操作代价是很昂贵的(READER 进程要对内存进
STEVEN NELSON 欢迎访问 INFORMATICA 群:2791138
感谢您的阅读,希望得到您的反馈意见 第 4 页 共 11 页
行反复的分配和回收)。字符串函数对于 ETL 来讲是十分重要,也是很必要的,我们不建议
完全的杜绝他们的使用,只是建议把字符串函数用在那些十分必要的地方。对这个问题我们
的优化建议是:在数据库的源中使用 VARCHAR/VARCHAR2 的数据类型,或者在数据源的
平面文件中使用不限定长度的字符串(尽可能的)。这样做有助于减少对输入数据的清理操
作。如果数据源是数据库,在数据库中执行带有 LTRIM/RTRIM 函数的 SQL 语句会比在
INFORMATICA 中进行同样的操作快多了。
7、IIF 函数的代价是不小的。如果有可能,通过重新设定逻辑来避免 IIF 函数的使用。
这不仅仅针对 INFORMATICA,在任何的编程语言中,它的代价都是很高的。它在工具中
引入了“决策”,也在逻辑中引入了多种可能的代码路径(从而增加了复杂度)。因此尽可能
的避免的使用 IIF 函数,而唯一可能替代 IIF 函数的方法是在 SQL 中使用 ORACLE 的
DECODE 函数。
8、序列发生器 Sequence Generators 会使得 MAPPING 变慢。很不幸,没有什么更快或
者更容易的方法来创建一个序列发生器。在 INFORMATICA 内部使用序列发生器的成本也
不是非常的高,尤其是使用缓冲(缓冲区的大小设置为 2000),这样看起来很合适。然而,
如果有任何可能避免,使用序列发生器都像是衣服上的脏点儿。如果不是因为需要在
MAPPING 进行计算等原因而必须引入序列,并且你使用的是 ORACLE 数据库,那么最好
使用 SQL*LOADER 来给所有的行记录创建一个序列发生器。如果使用的是 SYBASE 数据
库,不要在目标中指定标识(IDENTITY)列,使用 SYBASE 服务器来生成那一列。同时,
避免使用“可复用”的序列发生器,因为这样的序列发生器会让 MAPPING 更加的慢,即使
带有缓冲。
9、TEST 表达式控件使得 MAPPING 变慢。IS_SPACES 之类的表达式会减慢 MAPPING
的运行速度,因为这个数据合法性的表达式必须把整个字符串都扫描后才能发现是否是空
格,同样的道理,IS_NUMBER 也必须检查整个字符串。只要有可能,在不需要进行转换前
的预先检查的情况下,这些表达式都应该被删除。但是要知道,不带检查的直接转换一个无
效的表达式可能会是的整个转换失败。如果你必须对一个数字型的字符串进行检查,试着用
IIF(<field> * 1 >= 0,<field>,NULL),假如你不关心它是否是 0 的话。一个字母在这个表达式
中返回的是一个 NULL 值。IIF 条件判断比 IS_NUMBER 要快一些,因为 IS_NUMBER 需要
解析整个字符串,而乘法表达式速度自然就快了。
10、减 少 MAPPING 中的对象的个数。通常,这些工具的目的是使得“数据的转换映射”
尽可能的简单。大部分情况下,这就意味着对于每个输入/转换都建立一个表达式(考虑一
种极端的情况)。每个对象都会增加 MAPPING 的计算负荷,也就会增加运行时间。当性能
是问题时,可以将几个表达式集中到一个表达式对象中进行,因此减少了对象的开销。这样
做,可以加速 MAPPING 的运行。
11、UPDATE 表达式,将 SESSION 的属性设置为 UPDATE ELSE INSERT。如果已经这
个开关打开的话,会导致 SESSION 的运行速度明显的下降,因为 INFORMATICA 对每行记
录都执行两个操作:更新(根据主键),如果返回的结果时更新了 0 条记录,再执行一个插
入操作。改变这种情况的办法是,提前知道在 MAPPING 中要执行的是 DD_UPDATE,还 是
DD_INSERT,然后告诉 UPDATE 控件采用什么更新策略。接下来你可以改变 SESSION 的
属性为 INSERT/UPDATE AS UPDATE/UPDATE AS INSERT。
12、同时写入多个目标的速度很慢。通常 MAPPING 会产生多个数据目标,有时会有多
个数据源。这样的结果是更加花费时间,尽管第一眼看起来并不是这么回事儿。如果体系结
构允许改变,同时用户也能够对 MAPPING 进行调整,那么尝试着对体系结构进行修改:一
个数据目标一个 MAPPING 是基本的标准。一旦达到这个要求,调优就变得很容易。有时将
MAPPING 减少到一个数据源一个数据目标的情况是更好的。但是,如果体系结构允许更多