东软医保收件出现:执行批量导入缓冲数据出错 舌苔厚白是怎么回事事?

在登陆东软医保时出现下载信息出错,下载kao2数据失败!执行EapAgent_sendReques_百度知道
在登陆东软医保时出现下载信息出错,下载kao2数据失败!执行EapAgent_sendReques
在登陆东软医保时出现下载信息出错,下载kao2数据失败!执行EapAgent_sendRequest0时错误,请检查网络连接状况
提问者采纳
一般C盘系统重装后以前的软件注册表信息会丢失的,这样的话,你只能先删掉已经装过的东软医保软件,然后重新使用这个软件安装包重新安装一遍,注入C盘的注册表信息。记住,首先要找到这个软件的安装文件 一般是exe或setup文件
其他类似问题
为您推荐:
其他1条回答
数据库问题,问东软的人吧
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
Oracle® Connector 是 IBM® InfoSphere® Information Server 中的一个连接组件。IBM InfoSphere DataStage® 和 Information Server 套件中的其他产品利用 Oracle Connector 在 Oracle 数据库上执行提取、查找、加载和元数据导入操作。本文是由两部分组成的系列文章的第 2 部分,提供了一组以最大化性能为目标,调优 DataStage 并行作业中的 Oracle Connector 阶段的指南。
, 高级软件工程师, IBM
Predrag Maksimovic 是 IBM 位于佛罗里达州伯克莱顿的 InfoSphere Connectivity 团队的成员。他在用于企业数据集成的连接组件和工具的设计与开发方面拥有 15 年的经验。他感兴趣的领域包括关系数据库、企业消息传递系统和大数据技术。
简介在本系列的第 1 部分中,我们简要概述了 IBM Information Server 产品套件中的 IBM InfoSphere DataStage 产品,解释了 Oracle Connector 阶段在 DataStage 作业中的作用。我们解释了阶段的指挥者进程 (conductor process) 与执行者进程 (player process) 之间的区别。我们介绍了并行性和分区的概念,解释了它们在 DataStage 环境和 Oracle 数据库环境中的含义的差异。我们详细介绍了为了在数据库上执行 SQL 语句而配置的 Oracle Connector 阶段的性能调优和疑难解答,这些语句包括用于在数据库中抓取和查找行的查询语句,以及用于在数据库中插入、更新和删除行的 DML 和 PL/SQL 语句。在本系列的第 2 部分中,我们将继续介绍 Oracle Connector 性能调优。首先,我们将重点介绍连接器的批量加载模式的性能方面。在此模式下,连接器用于将数据加载到数据库中,在此过程中利用了 Oracle 直接路径接口。我们将介绍将记录加载到数据库中的操作,以及常常需要在加载记录之前和之后,在表索引和约束上执行的操作。我们然后将提供一些与结合使用拒绝链接和连接器相关的指南。我们将展示拒绝链接在一些情况下对连接器性能的影响,提供一些备用方法来满足您的考虑因素。在本文最后,我们将提供一些针对连接器中不同 Oracle 数据类型的处理的性能调优策略。与第 1 部分中一样,第 2 部分假设使用了 DataStage 并行作业和 Information Server Version 9.1,但提供的一些概念同样适用于 DataStage 服务器作业以及更早的 Information Server 版本。批量加载当 Oracle Connector 阶段被配置为在批量加载模式下运行时,它利用 Oracle 直接路径接口将数据写入目标数据库表。它从输入链接接收记录,并将其传递给 Oracle 数据库,该数据库将这些记录格式化为数据块并附加到目标表上,而不是将它们存储在现有块中的可用空闲空间中。要将该阶段配置为在批量加载模式下运行,必须将该阶段的 Write mode 属性设置为值 Bulk load。在这一节中,我们将介绍对调优该阶段中的批量加载操作性能具有重大影响的连接器属性和环境变量,如
所示。图 1. 影响批量加载性能的连接器属性与在 Insert 写入模式下运行相比,在 Bulk load 写入模式下运行该阶段通常会获得更高的性能。但是,Bulk load 写入模式引入了一些在使用 Insert 写入模式时并不存在的限制,尤其是在并行执行模式下运行该阶段并将 Allow concurrent load sessions 连接器属性设置为值 Yes 时。这些限制主要与目标表上定义的触发器、索引和约束的处理相关。本节剩余部分主要帮助您回答以下问题:我应将该阶段配置为在 Bulk load 还是 Insert 写入模式下运行? 如果我选择在 Bulk load 写入模式下运行该阶段,那么我应如何配置该阶段中的剩余设置才能获得最佳性能?数据量考虑因素当决定将该阶段配置为 Bulk load 或 Insert 写入模式时,需要考虑的主要是数据量,换句话说,在该阶段中,在一次作业调用中平均会有多少记录写入目标表。如果数据量相对较小,首选的选项是使用 Insert 写入模式,因为这种写入模式在维护目标表的索引、约束和触发器方面提供了更高的灵活性。在使用 Insert 写入模式时,所有表索引、约束和触发器都在作业执行期间执行,在作业完成后仍然有效。例如,如果在 Insert 写入模式下运行的阶段尝试向目标表插入一条记录,而该记录违反了该表中的主键约束,那么可以将该阶段配置为以多种方式处理此场景并继续处理剩余的记录,当该阶段在 Bulk load 写入模式下运行时,无法轻松采用这些方式。它可定义并配置一个拒绝链接来处理违反约束的记录。每个违反表约束的输入记录都将路由到拒绝链接,您还可以可选地提供记录被拒原因的错误代码和消息文本。表中违反主键约束的现有行将保留在表中。可以将它配置为在 Insert then update 写入模式下运行,此时会使用来自违反约束的记录的值来更新目标表中的现有行。可以将它配置为在 Insert new rows only 写入模式下运行,此时会跳过(忽略)违反约束的记录。可以将它配置为包含 LOG ERRORS INTO 子句的 INSERT 语句,这会导致 Oracle 将违反约束的记录和错误信息一起重定向到指定的错误日志表。如果数据量相对较大,并且主要目标是尽快将数据附加到目标表上,那么应考虑采用 Bulk load 模式。此处的问题是,应将多大的数据量视为小数据量或大数据量。这一决定取决于其他一些因素,比如您在选择 Insert 写入模式时希望牺牲多少性能,这取决于将数据推送到数据库的批次窗口大小和可用的系统资源。根据经验,数千个记录会被视为小数据量,而数百万个记录应可能被视为大数据量。如果表没有定义任何索引、约束和触发器,那么 Bulk load 写入模式会是一个不错的选项,无论涉及的数量有多大,因为这种写入模式带来的许多限制不再适用。这包括以下场景:表并没有定义索引、约束和触发器,但您拥有一些过程,可在加载数据之前禁用或丢弃它们,然后在加载完成后启用或重新构建它们。以下这个简单的测试可帮助您确定选择哪种写入模式:设计一个测试作业,它的 Oracle Connector 阶段有一个输入链接。在测试作业中,提供与将由生产环境中的实际作业处理的记录具有类似的数据量和结构的记录。确保测试作业中使用的目标数据库表拥有与将在生产环境中使用的表相同的定义。如果生产作业对数据库中的一个现有表执行增量数据加载,请确保用于测试作业的表最初填入了与将在生产环境中使用的表类似的行数。在插入模式下运行该作业多次,记录完成该作业所用的平均时间。手动禁用目标表上的任何索引、约束和触发器,对配置为批量加载写入模式的连接器阶段重复执行该作业多次,记录完成该作业所花费的平均时间。对比前两组作业运行的结果。如果得到的数字类似,则表明 Insert 写入模式就足够用。如果批量加载完成得更快,则确定需要在表上执行哪些额外操作来还原约束和索引。从某个工具(比如 SQL*Plus)发出这些操作,查看它们花费了多少时间来完成这些操作。如果该时间与批量加载数据所花费的总时间量明显少于插入数据所花费的时间,那么批量加载模式可能是更好的选择。处理触发器如果目标表拥有需要为写入表的每个行触发的触发器,则不应该使用批量加载模式,因为此模式不支持数据库触发器。要将数据批量加载到拥有触发器的表中,需要在加载前禁用触发器。该连接器提供了一个选项,能够在加载之前自动禁用触发器,并在加载之后启用它们。启用触发器后,它们仅为该时刻之后插入表的行而触发。它们不会为禁用触发器期间加载的行而触发。处理索引如果表拥有索引,可将该阶段配置为在执行加载时禁用所有索引。为此,可以将 Index maintenance 连接器属性设置为值 Skip all。这通常是最好的选择,因为它运行您没有限制地在并行执行模式下运行该阶段,使用在输入链接的 Partitioning 页面上选择的任何 Partition type 值。但是,所有索引都会在加载完成后标记为 UNUSABLE 并应重新构建。在这里,数据量和索引数量发挥着关键的作用。如果增量地加载对表中已存在的记录数而言相对少量的记录,在 Insert 写入模式下运行该阶段可能快得多,而且会让数据库在整个插入操作中维护索引,无需在批量加载后重构所有索引。另一方面,如果目标表是空的,而且需要向其中加入大量记录,那么使用 Bulk load 写入模式可能更合适,因为需要在所有行上构建索引,而且在这种情况下,第一次加载所有记录时不维护索引,然后从头构建索引,这样做会更快一些。无需在加载记录之后用外部工具重新构建索引,可以将该阶段配置为从 Oracle 数据库请求在加载期间维护索引,方法是将 Index maintenance 选项属性设置为 Do not skip unusable 或 Skip unusable。这两个选项的使用具有很高的限制性,而且在大多数情况下不是最佳选择。如果考虑使用这两个选项之一,则需要牢记以下事项:需要将 Allow concurrent load sessions 连接器属性设置为 No,否则在加载任何数据之前会获得 Oracle 错误 “ORA-26002: Table string has index defined upon it”。这项要求表明您无法在并行执行模式下运行该阶段,除了将数据加载到某个分区表中的特殊情况,本文
介绍如何将记录加载到分区表中的小节中将会介绍这种特殊情况。如果表有一个 UNIQUE 索引,该索引将在作业完成之后保持 VALID,但这种情况只出站在加载的所有行都未违反索引所要求的惟一性时。否则,索引会自动标记为 UNUSABLE,即使作业已经成功完成。对运行该作业的后续尝试将会失败,报告的 Oracle 错误取决于 Index maintenance option 属性值。对于 Do not skip unusable 值,错误将是 “ORA-26028: index string.string initially in unusable state”,对于 Skip unusable 值,错误将是 “ORA-26026: unique index string.string initially in unusable state”。如果表中包含一个 NON-UNIQUE 索引,那么该索引会在加载之后保持 VALID。如果该索引在加载之前被标记为 UNUSABLE,那么该行为将取决于 Index maintenance option 属性值。对于 Do not skip unusable 值,该索引会导致 Oracle 错误 “ORA-26002: Table string has index defined upon it”,对于 Skip unusable 值,该作业将完成,索引将保持 UNUSABLE 状态。您可以将阶段配置为在加载之后自动重新构建索引,可控制索引重新构建语句的 LOGGING 和 PARALLEL 子句,以便优化索引重新构建过程。您可以将阶段配置为在出现任何索引重新构建语句失败时让作业失败,或者仅发出警告消息。为了提升性能,连接器阶段仅在必要时才重新构建索引。它将在重新构建每个索引之前检查它的状态。如果索引被标记为 VALID,那么连接器将会跳过它。这同样适用于本地和全局分区的索引。在这种情况下,连接器将检查索引分区和子分区(如果索引是本地分区的且表是复合分区的),仅重新构建标记为 UNUSABLE 的索引分区和子分区。处理约束表上的完整性和参照约束会给批量加载操作带来影响,该影响与索引带来的影响类似。
无需在加载 NOT NULL 和 CHECK 约束之前禁用它们。如果任何输入记录违反了约束,那么作业将会失败,不会将任何记录加载到表中。一种例外情况是,阶段被配置为在并行执行模式下运行,而且一些执行者进程在遇到记录错误的执行者进程之前已完成其记录分区的加载。在这种情况下,会将已完成的执行者进程加载的记录提交到表中。从性能角度讲,处理这两种约束的一个好方法是在加载期间保持它们处于已启用状态,但通过在连接器阶段上游执行必要的检查和错误处理来确保没有记录违反它们。本节后面部分将会提供一些具体的建议来解决
问题。FOREIGN KEY、UNIQUE 和 PRIMARY KEY 约束也不需要在加载前禁用,但事实上会被加载操作忽略。任何违反这些约束的记录都仍会加载,这些约束将保持 VALIDATED 和 ENABLED 状态。要确保这些约束对连接器阶段加载的行有效,需要在加载前禁用它们并在加载后启用它们。请记住,这些约束类型通常附带了索引。数据库通过惟一索引执行 UNIQUE 和 PRIMARY KEY 约束,FOREIGN KEY 约束常常拥有用户定义的索引。在前面介绍
的小节中,我们介绍了索引对加载操作的影响。该影响同样适用于此情形并需要考虑。连接器提供了一个在加载约束之前禁用约束的选项。可通过将 Disable constraints 属性设置为 Yes 来指定此选项。当完成此设置后,加载操作通常会比插入操作更快地完成。但是,您必须在加载之后启用并验证这些约束,处理违反约束的已加载的记录。这一过程可能对总体性能产生重大影响。如果在 DataStage 作业之外有一种机制能够在加载约束之后启用和验证约束,那么让连接器在加载约束之前禁用它们会带来最佳的作业性能,因为在加载期间不会存在由约束导致的任何限制,作业结束时不会花费任何时间来启用约束。要将阶段配置为在加载后启用和验证约束,可将 Enable constraints 属性设置为 Yes。但是,如果此时有任何约束未通过验证,那么作业将失败,约束仍将处于 DISABLED 和 NOT VALIDATED 状态。可在 Exceptions table name 属性中指定异常表,违反约束的行的 ROWID 以及它们违反的约束名称将存储在该表中。如果任何约束无法启用,那么仍会导致作业失败,但您能够确定哪些行违反了那条约束。可对阶段执行进一步配置,从表中删除违反约束的行,并尝试再次启用约束,但这会导致丢弃表中已发现的违反约束的所有行。要将它们存储在某个地方而不是丢弃它们,可为阶段定义一个拒绝链接,并在该链接上启用 SQL error – constraint violation 条件。这将对性能产生重大影响,因为它会在单个执行者进程中按顺序执行阶段操作。不应接受此限制,您应考虑在并行执行模式下运行该阶段,并为 Write mode 指定 Insert 值,因为这样做有可能获得更高的总体性能。一般而言,最好尽可能地避免使用拒绝链接。介绍
的小节提供了这方面的一些具体理念。如果将阶段配置为在加载之前禁用表约束,在加载之后启用它们,并拒绝违反约束的记录,那么所有违反了表上定义的 UNIQUE 和 PRIMARY KEY 约束的记录都会遭到拒绝。连接器不会区分在加载前已存在于表中的行和连接器加载的行。例如,如果连接器加载的某个行违反了主键约束,因为在加载前表中已存在另一个具有相同主键值的行,那么这两行都会从表中删除并发送到拒绝链接。要让该阶段仅删除和拒绝违反约束的、在加载前未在表中的行,需要实现一个自定义解决方案,比如
中给出的解决方案。对索引和约束的自定义处理当连接器阶段被配置为在加载之前和之后自动处理触发器、索引和约束时,连接器将通过在数据库上发出各种数据定义语言 (DDL) 语句来完成此任务。对于启用和禁用触发器,它将使用 ALTER TRIGGER 语句;对于重新构建索引,它将使用 ALTER INDEX 语句;对于启用和禁用约束,它将使用 ALTER TABLE 语句。如果在将 CC_MSG_LEVEL 环境变量设置为值 2 的情况下运行作业,可在作业日志中找到这些语句。可使用连接器提供的一些属性在这些语句中包含或删除特定的子句。例如,它提供的一些属性允许您控制是否在 ALTER INDEX … REBUILD 语句中包含 PARALLEL 和 LOGGING 子句。在某些情况下,您可能希望执行自己的处理触发器、索引和约束的语句,而不是让连接器自动生成和运行它们。例如,您可能希望直接使用名称来引用表触发器、索引和约束,而不是让连接器通过查询数据库字典视图动态地发现这些对象。您可能希望手动将无法通过连接器属性配置的某些子句包含在这些语句中。可在运行作业之前和之后运行外部工具和脚本来,在阶段外部实现此目的。为此,可利用 Before SQL statement 和 After SQL statement 连接器属性在阶段中完成此操作。在这两种属性中,您可指定一个要执行的用分号分隔的 SQL 语句组成的列表或一个匿名 PL/SQL 块。连接器阶段在指挥者进程中执行这些语句。它会在为阶段创建任何执行者进程处理记录之前运行 Before SQL statement 语句。它将在所有执行者进程都完成记录的加载后运行 After SQL statement 语句。下面的示例演示了如何实现此目的。假设您希望将记录加载到表 TABLE_ITEMS 中,该表存储了某些类型的商品的信息。该表有一个 ID 列,用于表示商品标识符并将它们用作表的主键,这表明该表在同一列上定义了一个惟一索引。该表还提供了 NAME 列来存储商品名称,而且在该表上为该列定义了一个非惟一索引。最后,该表拥有 LOAD_DATE 列,它表示加载商品行的日期和时间。 中所示的语句可用于创建此表。清单 1. Create table 语句示例CREATE TABLE TABLE_ITEMS(ID NUMBER(10), NAME VARCHAR2(20), LOAD_DATE DATE);
ALTER TABLE TABLE_ITEMS ADD CONSTRAINT PK_TABLE_ITEMS_ID PRIMARY KEY (ID);
CREATE INDEX IDX_TABLE_ITEMS_NAME ON TABLE_ITEMS(NAME);加载日期在作业运行时设置,作为一个作业参数以 YYYY-MM-SS HH24:MI:SS 格式传递给作业。可使用各种机制来设置此值并将它传递给作业。例如,如果使用 dsjob 命令从命令行调用作业,那么可以使用 system date 命令生成此值。举例而言,在 Linux 上,可使用
中所示的命令运行作业,基于当前的系统日期和时间传递 LOAD_DATE 作业参数值。清单 2. dsjob 命令调用dsjob -run -jobstatus -userstatus -param LOAD_DATE="`date +'%F %T'`" project_namejob_name传递当前日期和时间的另一个选项是创建一个顺序作业,其中包含一个活动阶段,该阶段会调用加载作业并将 LOAD_DATE 作业参数初始化为值 DSJobStartTimestamp,这个值是一个返回作业开始时间戳的内置的 DataStage 宏。假设表中已包含许多行,并且您打算运行您的作业来加载更多的行。已加载的大部分记录都是针对新商品的,但也有一些记录表示现有的商品,也就是说,它们拥有的 ID 字段值与表中的一行拥有的 ID 值相同。您希望尽快加载数据,还希望在加载后启用约束和索引,并且这些约束和索引对所有表行有效。如果任何加载的行违反了主键约束,那么您希望将它们存储在一个备用表 TABLE_ITEMS_DUPLICATES 中,这个备用表中包含与 TABLE_ITEMS 表相同的列,但没有定义任何约束和索引,如
所示。清单 3. 重复项的 Create table 语句CREATE TABLE TABLE_ITEMS_DUPLICATES(ID NUMBER(10),
NAME VARCHAR2(20),
LOAD_DATE DATE);要完成此任务,可以将阶段配置为在加载前禁用约束,在加载期间跳过所有索引,在加载后重新构建索引和启用约束。可在阶段上定义拒绝链接,在拒绝链接上选择 SQL error – constraint violations 条件,并将此链接定向到另一个 Oracle Connector 阶段,后者被配置为将行插入 TABLE_ITEMS_DUPLICATES 表中。但此方法具有以下限制:因为您将该阶段配置为禁用约束并在启用约束后拒绝违反它们的行,所以连接器在单个执行者进程中顺序执行。在拒绝链接上对记录的拒绝仅在执行者进程中执行,在这种情况下,拒绝操作在连接器在加载后启用约束时执行。执行者进程要在完成加载记录后启用约束,它需要确认它是该阶段的惟一的执行者进程。但实际上,您可能希望在并行执行模式下运行阶段,以便您可利用引擎层上的可用系统资源。连接器拒绝所有违反主键约束的行,包括加载之前已存在于表中但恰好与已加载的一些行具有相同的 ID 值的行。这是因为在启用约束时,所有行已存储在表中,那时没有对加载前已经存在于表中的行和加载的行进行区分。实际上,您可能希望仅拒绝作业加载的违反约束的行,而不是拒绝运行作业之前已经存在于表中的所有行。以下是一种避免这些限制的可能方法。在 Before SQL statement 属性中指定
中所示的语句。清单 4. 禁用 PK 约束的语句ALTER TABLE TABLE_ITEMS DISABLE CONSTRAINT PK_TABLE_ITEMS_ID;在将记录加载到表中之前,该语句会在表上显式禁用约束 PK_TABLE_ITEMS。将 Index maintenance option 连接器属性设置为 Skip all。将 Allow concurrent load sessions 连接器属性设置为值 Yes。不要为阶段定义拒绝链接。将阶段配置为在并行执行模式下运行。定义异常表 TABLE_ITEMS_EXCEPTION。我们希望调用的 ALTER TABLE 语句的 ENABLE CONSTRAINT 子句的 EXCEPTIONS INTO 选项需要使用此表(稍后将解释)。在 Oracle 数据库产品安装中包含的 SQL 脚本 UTLEXCPT.SQL 中,可以找到异常表需要遵循的格式。基于此脚本中的信息,需要为该示例创建 TABLE_ITEMS_EXCEPTION 异常表,可以执行
中所示的语句。清单 5. 创建异常表的语句CREATE TABLE TABLE_ITEMS_EXCEPTIONS(ROW_ID ROWID,
OWNER VARCHAR2(30),
TABLE_NAME VARCHAR2(30),
CONSTRAINT VARCHAR2(30));在 After SQL statement 属性中指定
中所示的 PL/SQL 匿名块。在加载所有记录都之后,连接器会将它提交到数据库。请参阅 PL/SQL 代码中包含的注释,了解这个 PL/SQL 块执行的各个操作的详细信息。清单 6. 处理索引和约束的自定义 PL/SQL 代码DECLARE
-- Define the exception for handling constraint validation error ORA-02437.
cannot_validate_constraint EXCEPTION;
PRAGMA EXCEPTION_INIT(cannot_validate_constraint, -2437);
-- Truncate the tables TABLE_ITEMS_DUPLICATES and TABLE_ITEMS_EXCEPTIONS in case
-- they contain any rows from the previous job runs.
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_ITEMS_DUPLICATES';
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_ITEMS_EXCEPTIONS';
-- Try to enable the PK_TABLE_ITEMS_ID constraint and to build the underlying
-- unique index. If any rows are in violation of the constraint then store
-- their ROWIDs to the TABLE_ITEMS_EXCEPTIONS table.
EXECUTE IMMEDIATE 'ALTER TABLE TABLE_ITEMS
ENABLE CONSTRAINT PK_TABLE_ITEMS_ID
EXCEPTIONS INTO TABLE_ITEMS_EXCEPTIONS';
EXCEPTION WHEN cannot_validate_constraint THEN
-- The constraint could not be enabled. The constraint violations need to be
-- handled before trying again to enable the constraint.
-- Set the default date format for the session to match the format of
-- LOAD_DATE job parameter value.
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
-- Copy rows from TABLE_ITEMS table to TABLE_ITEMS_DUPLICATES table that
-- violated the constraint and were loaded by this job. The rows that were
-- loaded by this job will have the LOAD_DATE column value that matches the
-- LOAD_DATE job parameter value.
INSERT INTO TABLE_ITEMS_DUPLICATES
SELECT ID, NAME, LOAD_DATE
FROM TABLE_ITEMS
WHERE ROWID IN (SELECT ROW_ID FROM TABLE_ITEMS_EXCEPTIONS) AND
LOAD_DATE='#LOAD_DATE#';
-- Delete the rows from TABLE_ITEMS that were copied to TABLE_ITEMS_DUPLICATES.
DELETE FROM TABLE_ITEMS
WHERE ROWID IN (SELECT ROW_ID FROM TABLE_ITEMS_EXCEPTIONS) AND
LOAD_DATE='#LOAD_DATE#';
-- Try to enable the constraint again. This time the operation should be
-- successful.
EXECUTE IMMEDIATE 'ALTER TABLE TABLE_ITEMS ENABLE CONSTRAINT PK_TABLE_ITEMS_ID';
-- Rebuild the non-unique index IDX_TBL_ITEMS_COL_NAME that was disabled
-- during the load.
EXECUTE IMMEDIATE 'ALTER INDEX IDX_TABLE_ITEMS_NAME REBUILD PARALLEL NOLOGGING';
END;利用 Oracle 日期缓存可将阶段配置为利用 Oracle 日期缓存特性,只需将 Use Oracle date cache 属性设置为值 Yes 即可。只可以将此特性用于批量加载模式,当输入链接拥有一个或多个 Date 或 Timestamp 列时,可以使用这些列将值加载到 TIMESTAMP 表列,这些列可以拥有许多重复的值,这可以显著提高加载性能。连接器准备好了 TIMESTAMP 表列的值,在将这些值存储到表中之前需要转换它们的格式。当利用日期进行缓存时,转换的结果也被缓存,所以当输入中再次出现相同值时,会使用缓存结果而不是再次执行转换。通过 Cache size 属性可以指定日期缓存中的条目数量。为了避免在缓存中查找值时出现缓存未命中 (cache miss),可将此属性设置为不超过预期将在每个 Date 和 Timestamp 链接列的输入上遇到的不同值的总数。如果日期缓存在加载期间装满了,那么可以选择禁用它,方法是将 Disable cache when full 属性设置为 Yes。使用此方法的一种场景是:反复运行作业,以便将记录加载到目标表中。在大部分时间,不同输入值的总数会小于所选的缓存大小,但在少数情况下,大部分输入值是惟一的。在这种情况下,在缓存装满时禁用缓存会避免在已装满的日期缓存上执行查找,这将提高性能,因为每次查找都会导致缓存未命中。请注意,在阶段配置为在并行执行模式下运行时,它的每个执行者进程将使用自己的日期缓存。在 Information Server Version 9.1 中,当使用 Date 和 Timestamp 输入链接列将值加载到 DATE 表列中,而不是 TIMESTAMP 表列中时,不需要在将连接器提供的值存储到目标表中之前转换它们的格式。因此,在这种情况下,使用日期缓存特性不会带来太多的好处。在 9.1 版之前的 Information Server 版本中,需要在这种情况下执行转换,所以,使用日期缓存会带来与将值加载到 TIMESTAMP 目标表列中类似的好处。禁用重做日志数据库重做日志 (redo log) 会跟踪对数据库的更改,可在数据库恢复流程中使用。当连接器将数据加载到目标表时,会更新重做日志,以反映加载到表中的行。在数据库存储媒体发生故障时,在从最新的备份还原数据库后,会从重做日志还原连接器自执行备份以来加载的行。从重做日志还原加载的行的能力会有可能会导致性能下降,因为在需要维护重做日志以及捕获加载到表中的数据时,完成加载操作可能需要更长的时间。要加速连接器执行的加载操作,可通过设置目标表上的 NOLOGGING 属性来禁用重做日志。可在创建表时设置此标志,如果希望仅在加载期间设置它,那么可以使用 Before SQL statement 和 After SQL statement 连接器属性这么做。在 Before SQL statement 属性中指定语句 ALTER TABLE table_name NOLOGGING,在 After SQL statement& 属性中指定语句 ALTER TABLE table_nameLOGGING,其中 table_name 是该阶段将数据加载到表的名称。另一个选项是使用 Disable logging 连接器属性:在将该属性设置为 No 时,会使用日志标志(LOGGING 或 NOLOGGING);在将该属性设置为 Yes 时,会禁用重做日志。对批量加载禁用重做日志会显著提高加载性能。在出现介质故障时,如果在加载之后执行了数据库备份,在禁用重做日志期间加载的数据可从备份还原,但无法从重做日志还原。如果在发生介质故障时不需要从重做日志还原加载的数据,或者在该情况下可以轻松地重新加载数据,那么应考虑禁用重做日志来加快加载操作速度。参见
部分,获取 Oracle Database 在线文档的链接,您可在其中找到重做日志的更多信息,以及一些与禁用重做日志相关的考虑因素。如果希望在批量加载模式下使用连接器将数据快速传输到目标数据库,但同时还需要像使用传统插入语句那样维护目标表触发器、索引和约束,那么可以考虑的一个选择是:最开始的时候将记录加载到某个中间暂存表中,这个表具有与目标表相同的定义,但不包含任何触发器、索引和约束。在将记录加载到暂存表后,发出后续的 MERGE 或 INSERT 语句,从暂存表中读取行并将它们写入目标表。此语句可在 After SQL statement 连接器属性中指定,以便在结束作业时自动调用它。使用暂存表结果会导致数据被写入两次(一次在连接器将其加载到暂存表时,一次在后续语句将它复制到目标表时),但与此同时,这些数据会具有以下有利特征:记录仅由作业处理一次。在处理资源密集型作业中的记录时,这非常重要。记录仅从 DataStage 引擎主机转移到数据库主机一次。INSERT 语句将在数据库端执行,所以在此期间,可使用 DataStage 引擎主机来处理其他工作负载。可使用 INSERT 语句中的数据库 SQL 函数在加载到暂存表中的值上执行额外的转换,然后将它们存储到目标表中。如果因为某种原因而导致复制值的 INSERT 语句失败,那么加载的记录仍将保留在暂存表中,您可在处理暂存表中导致错误的行之后发出另一个 INSERT 语句。您可以利用 INSERT 语句中的 LOG ERRORS INTO 子句,导致 INSERT 语句失败的行会与描述错误原因的详细信息一起发送给错误日志表。目标表上的索引、约束和触发器将始终保持启用、有效和执行。手动加载您可以将 Oracle Connector 阶段配置为在手动加载模式下运行,在这种情况下,该阶段会将记录写入引擎层主机上的一个文件中,然后可以将该文件传递给 Oracle SQL*Loader 实用程序,以便将记录加载到目标表中。要将该阶段配置为此模式,可将 Manual load 属性设置为 Yes。在手动加载模式下加载记录一般比直接加载到目标表更慢,但在一些情况下可能非常有用,接下来将会看到。一个示例是,在希望通过运行作业在无法加载到目标数据库时提取和处理数据的时候。您可以将该阶段配置为将数据存储到某个文件中,然后在以后数据库可用时,使用 SQL*Loader 实用程序将数据加载到其中。在那时,已经处理好数据并准备将它存储在目标表中。有时,在作业的处理阶段需要花费较长的时间才能完成的时候,比如在从缓慢的外部来源提取记录时或者作业涉及到复杂的 CPU 密集型转换时,手动加载方法可以节省大量的时间。请注意,连接器在此模式下实际上生成了两个文件:数据文件和控制文件,数据文件包含要加载的记录,控制文件用于向 SQL*Loader 传递选项,告知它数据文件的位置和格式。您也可以将生成的文件传输到某个没有安装 DataStage 的主机并从那里加载记录,前提是该主机上拥有 SQL*Loader 工具。如果该主机是 Oracle 服务器主机,那么加载操作将在数据库本地执行。使用此方法,还可以方便地重新开始加载并备份需要加载的数据,因为生成的数据文件已具有受 SQL*Loader 工具支持的格式。请注意,在将该阶段配置为在手动加载模式下运行时,它会尝试连接数据库,即使它不会在该连接上将记录加载到该数据库中。如果在运行作业时,目标数据库无法接受连接,那么可以让该阶段指向此时可用的另一个数据库,以便该阶段可以建立一个连接并完成手动加载操作。如果确保该阶段未连接到任何手动加载模式下的数据库非常重要,那么应确保以下条件得以满足:连接器没有收集操作元数据。要确保这一点,可以为作业定义 DS_NO_PROCESS_METADATA 环境变量,并将它设置为值 FALSE。连接器不会在数据库上发出将被 IBM InfoSphere Guardium Activity Monitor 解释为事件的语句。为了确保这一点,应确保您没有为作业设置 CC_GUARDIUM_EVENTS 环境变量。必须将 Run before and after SQL statements 属性设置为 No。这可以确保连接器不会尝试在将记录加载到文件前后在数据库上执行任何 SQL 语句。必须将 Table action 属性设置为 Append。这可以确保在执行加载操作之前,连接器不会尝试创建、丢弃或截断一个数据库表。Perform operations before bulk load 和 Perform operations after bulk load 属性不得指定任何索引和约束维护操作。当所有这些条件都得到满足后,连接器会将记录加载到数据文件中,而不连接数据库。但您仍需要提供 Username 和 Password 属性值,然后才能够编译作业。可以将它们设置为一些虚拟值,或者将 Use external authentication 属性设置为值 Yes,这会禁用 Username 和 Password 属性,所以您不需要为它们提供值。请注意,即使将阶段配置为不连接到数据库,仍然需要将 Oracle Client 产品安装在运行连接器的 DataStage 引擎主机上,否则在启动作业时将无法初始化连接器,作业将会失败。数组大小和缓冲区大小当 Oracle Connector 阶段被配置为在批量加载模式下运行时,它从输入链接读取记录并将它们存储在特定于 Oracle 的直接路径列数组中。连接器不会像用于抓取和 DML 操作的数组一样,在内存中创建此数组。相反,Oracle 客户端代表连接器创建此数组。此数组的大小(记录的数量)是通过 Array size 属性来指定的。默认值为 2000。当列数组装满后,连接器从 Oracle 客户端请求将数组转换为内部流缓冲区格式,并将此缓冲区发送到 Oracle 服务器。此流缓冲区的大小(以 KB 为单位)通过 Buffer size 连接器属性指定。该属性的默认值为 1024(1 MB)。根据记录的长度,指定的 Buffer size 值可能无法以流格式存储 Array size 数量的记录。在这种情况下,Array size 会自动降低为一个更小的值,Oracle Connector 会记录一条消息,表明它一次将加载的新的记录数量。请注意,无论指定的 Buffer size 值为多少,Array size 的最大值是 4096。当配置 Array size 和 Buffer size 值来实现最佳性能时,可以应用以下方法:将 Array size 设置为 4096(支持的最大值),将 Buffer size 设置为 1024。运行作业,检查连接器是否在作业日志中报告了一条消息,指出它一次加载的记录少于 4096 条。如果它这么做了,则转到第 3 步。如果它没有这么做,则转到第 4 步。继续尝试逐渐增大 Buffer size 值,直到性能下降或连接器停止报告消息(看哪种情况先发生)。继续尝试逐渐减小 Buffer size 值,直到性能下降。在并行执行模式下的阶段中加载记录可以将连接器配置为在并行执行模式下运行,从多个执行者进程加载数据,每个执行者进程将输入链接记录的一个子集(分区)加载到目标表中。在这种情况下,必须为目标表段启用并行加载。为此,请将 Allow concurrent load sessions 连接器属性设置为值 Yes。如果该属性被设置为 No,并且您尝试从多个执行者进程加载记录,那么您会收到 Oracle 错误 “ORA-00604: error occurred at recursive SQL level 1”,可能还附带了 Oracle 错误 “ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired”。上述规则的一个例外情况时,该阶段将行加载到一个 Range、List 或 Interval 分区的表(该表也可执行子分区),并且链接的 Partition type 被设置为 Oracle Connector。在
中会介绍这个例外场景,这一节将讨论如何将记录加载到分区表中。将 Allow concurrent load sessions 属性设置为 Yes,这对在加载期间处理索引的方式有一定的影响。有关的更多信息,请参阅之前讨论
的一节。将记录加载到分区表中当希望将记录加载到目标表的一个分区或子分区时,可以将 Table scope 连接器属性设置为 Single partition 或 Single subpartition 值,在 Partition name 或 Subpartition name 属性中指定分区或子分区的名称。这会导致仅锁定指定的分区或子分区的分段,如果有任何输入记录需要存储到另一个分区中,那么还会返回错误,以便验证记录属于在该阶段中指定的分区还是子分区。在希望将记录加载到表的多个分区时,可以将 Table scope 连接器属性设置为值 Entire table。对于表上定义的触发器、索引和约束,适用于非分区表的概念同样也适用于这种情形。当在分区表上重新构建索引时,连接器只会自动重新构建在加载期间标记为不可用的索引分区或子分区。这同时适用于本地和全局分区索引。当希望并行加载记录并确保每个执行者进程将记录加载到某个专用表分区时,可以对基于 Range、List 或 Interval 分区策略而分区的表这么做(并有选择地为其创建子分区),方法是将输入链接的 Partition type 设置指定为 Oracle connector 值。在这种情况下,该阶段的每个执行者进程都将与某个专用的表分区进行关联,将数据加载到该分区的分段中(或者如果表是复合分区的,则将数据加载到它的一组子分区分段中),而且因为两个执行者进程将访问同一个分段,所以可将 Allow concurrent load sessions 连接器属性设置为 No。一个例外情况是当表具有一个全局分区索引时。在这种情况下,作业将会失败并抛出 Oracle 错误 “ORA-26017: global indexes not allowed for direct path load of table partition string”。如果在将记录加载到分区表时,考虑对 Partition type 使用 Oracle connector 值,那么可以参阅第 1 部分中介绍分区表上的 DML 操作的一节中提供的列表。拒绝链接的考虑因素对于数据库在尝试执行阶段中指定的操作时报告了错误的输入记录,拒绝链接是一种处理它们的便利机制。可以在应拒绝出现错误的记录的拒绝链接上启用拒绝条件,可以选择将错误代码和错误文本信息包含在拒绝的记录中,也可以将拒绝链接指向另一个阶段,将拒绝的记录存储在您选择的某个地方,比如一个文件或另一个数据库表。但是,拒绝链接可能对性能产生负面影响。如果阶段定义了拒绝链接,那么它需要检查数据库报告的每个出错记录的错误代码,将该代码与拒绝链接上定义的条件进行对比,并将该记录提交给拒绝链接,错误代码和错误文本信息有可能会一起提交。这些操作会消耗系统资源,影响作业的整体性能。前面我们已经了解到,在批量加载写入模式下,为了使用拒绝链接来处理违反约束的记录,必须在顺序执行模式下运行该阶段。这样做会导致拒绝表中所有违反约束的行,包括进行加载之前已经存在于表中的行。同样,在运行带 APPEND_VALUES 优化提示的 INSERT 语句时,不能使用拒绝链接功能。为了避免这些与拒绝链接的使用相关的限制,可以避免使用拒绝链接,尝试在记录到达 Oracle Connector 阶段之前消除其中的错误,或者在该阶段完成为其配置的操作后消除这些错误。作为在记录到达 Oracle Connector 阶段之前处理其中的错误的示例,我们可以了解一下使用
中所示的语句创建的表中的 NOT NULL 和 CHECK 约束。清单 7. 创建测试表的语句CREATE TABLE TABLE_TEST(C1 NUMBER(10) CONSTRAINT CONSTR_NOT_NULL_C1 NOT NULL,
C2 VARCHAR2(20),
CONSTRAINT CONSTR_CHK_C1 CHECK (C1 & 20000 AND C1 & 70000));此表上的约束要求字段 C1 的值不是 NULL,而且该值应在 20000 和 70000(不含)之间。无需将 Oracle Connector 配置为使用一个拒绝链接来处理这些约束,约束检查可在 Oracle Connector 阶段上游的阶段中完成。例如,可使用 Filter 阶段,它有一个输出链接引导至 Oracle Connector 阶段,有另一个拒绝链接引导至一个 Sequential File 阶段(或者您希望将坏记录定向到的任何其他阶段)。在 Filter 阶段的 Where Clause 属性中,可指定一个如
中所示的条件。清单 8. Filter 阶段条件C1 IS NOT NULL AND C1 & 20000 AND C1 & 70000还可以将 Filter 阶段的 Output Rejects 属性设置为值 True。Filter 阶段会将满足此约束的记录传递到它的输出链接,将剩余记录发送到拒绝链接。此配置如
所示。图 2. 使用 Filter 阶段处理约束违反对于更复杂的约束表达式,或者要使用描述拒绝原因的信息来注释遭到拒绝的记录,可以使用 Transformer 阶段。对于前面的示例,Transformer 阶段会有一个包含 C1、C2 和 C3 列的输入链接(例如 input_records)和三个输出链接。所有三个输出链接都会从输入链接复制列。第一个输出链接定义了约束 IsNull(input_records.C1),还有一个包含常量文字值 "C1 value is null." 的列。第二个输出链接定义了约束 input_records.C1 &= 20000 Or input_records.C1 &= 70000,还有一个包含文字值 "C1 value: " : input_records.C1 : " is not between 20000 and 70000." 的额外的列。前两个链接将引导至 Funnel 阶段,该阶段将会组合它们之上的记录,并使用 Sequential File 阶段将这些记录存储到一个拒绝文件中。第三个输出链接将引导至 Oracle Connector 阶段,该阶段将记录写入表中。此配置如
所示。图 3. 使用 Transformer 阶段处理约束违反图 3. 使用 Transformer 阶段处理约束违反以下是在阶段将记录转移到数据库后处理包含错误的记录的一些示例:当批量加载到具有约束的目标表时,将记录加载到一个没有定义约束的暂存表中,然后发出一个后续 INSERT 语句,将记录转移到目标表。在插入语句中指定 LOG ERRORS INTO 子句,以便将出错的记录定向到某个备用表。有关的详细信息,请参阅
介绍将记录加载到暂存表的小节。当批量加载到具有约束的目标表时,可将该阶段配置为在加载之前禁用约束和在加载之后启用约束,指定异常表,但不要将该阶段配置为自动处理异常。相反,应在作业完成后手动处理它们。您也可以使用一条策略对约束和索引执行自定义处理,比如本文
建议的一条策略。数据类型在这一节中,我们将介绍链接列的数据类型选择对连接器性能的影响。默认链接列数据类型由连接器在导入表定义时提供。当该阶段有一个没有定义列的输出链接,并且对该链接启用了运行时列传播特性时,可由连接器在运行时提供它们。默认链接列数据类型在支持的值范围方面与相应的表列数据类型最匹配。在某些情况下,您能够进一步了解该阶段所处理的实际数据值的格式和范围,从而为链接列选择能够带来更高的连接器性能的数据类型。在这一节中,将介绍许多这类场景。应该始终从具有默认数据类型的链接列开始。要确定默认数据类型,可以使用连接器导入您将从该阶段访问的表,查看导入的表定义中的列定义。如果将该阶段配置为发出一个引用多个表的复杂的 SELECT 语句,则无法为该语句导入单个表定义。在这种情况下,您能做的只是基于该语句创建一个临时视图,然后导入该视图。当您的阶段被配置为执行一个 PL/SQL 匿名块时,您将无法导入表或视图来确定默认的链接列数据类型。在这种情况下,可以分析 PL/SQL 块,为 PL/SQL 块中的每个绑定参数(以 :param_name 或 ORCHESTRATE.param_name 格式指定)确定数据库中与它对应的对象。在某些情况下,此对象将是一个表或视图中的一列,在另外一些情况下,它会是一个存储过程的一个参数,但在所有情况下,该对象都有一个相关的 Oracle 数据类型。创建一个临时表,其中包含具有这些相同数据类型的列,然后导入该表。请参阅
一节,获取 Information Server 信息中心的链接,您可在其中找到表明 Oracle Connector 的Oracle 数据类型与 DataStage 数据类型的默认对应关系的表。将具有默认数据类型的列放在链接上之后,运行作业并测量性能。然后应用本节其余部分的信息进一步优化作业,并更改链接列数据类型,以便提高性能并且不会丢失数据。表示 CHAR、VARCHAR2、NCHAR 和 NVARCHAR2 表列数据类型在这一节中,我们将介绍 CHAR、VARCHAR2、NCHAR 和 NVARCHAR2 Oracle 数据类型。当使用 Oracle Connector 导入包含具有这 4 种数据类型的列的表时,连接器会将 CHAR 和 VARCHAR2 表列建模为 DataStage Char 和 VarChar 链接列,将 NCHAR 和 NVARCHAR2 表列建模为 DataStage NChar 和 NVarChar 链接列。此规则的一个例外是,在 CHAR 和 VARCHAR2 表列定义基于 character 长度语义,并且数据库字符集是一个多字节字符集(比如 AL32UTF8)时。在这种情况下,CHAR 和 VARCHAR2 列建模为 NChar 和 NVarChar 链接列。如果数据库字符集是一个多字节字符集,比如 AL32UTF8,并且您的表列使用了字符长度语义,比如将一列定义为 VARCHAR2(10 CHAR) 类型,所有实际的数据值仅使用单字节字符,那么可在链接上使用 Char 和 VarChar 列(Extended 属性保留为空),而不使用 NChar 和 NVarChar 列。在该阶段中最大限度减少字符集转换,确保作业的有效 NLS_LANG 环境变量值与为作业指定的 NLS 映射名称兼容。这不仅对性能很重要,对阶段正确解释值的字符集编码也很重要。要确定作业的有效 NLS_LANG 值,可运行该作业,将 CC_MSG_LEVEL 环境变量设置为 2 并检查作业日志。连接器将记录有效的 NLS_LANG 环境变量值。如果希望使用不同的值,则需要为作业定义 NLS_LANG 环境变量,将它设置为想要的值。Oracle Connector 阶段编辑器没有 NLS 选项卡,所以在该阶段使用了为作业选择的 NLS 映射名称。要为作业指定此值,可在 DataStage Designer 中打开作业,选择菜单选项 Edit,然后单击对话框中的 Job properties 和 NLS 页面,在 Default map for stages 设置中提供相应的值。 给出了兼容的 NLS 映射名称和 NLS_LANG 值的示例。请注意,您应该将 NLS_LANG 值的语言和类别部分设置为与您的 DataStage 引擎主机的语言环境相符的语言和类别。表 1. 兼容的 NLS 映射名称和 NLS_LANG 值NLS 映射名称Compatible NLS_LANGUTF-8AMERICAN_AMERICA.AL32UTF8Windows-1252AMERICAN_AMERICA.WE8MSWIN1252ISO-8859-P1 GERMAN_GERMANY.WE8ISO8859P1ASCL_ASCIIAMERICAN_AMERICA.US7ASCIIShift-JISJAPANESE_JAPAN.JA16SJIS如果该阶段处理的值仅基于 ASCII 字符,可将 NLS 映射名设置为 ASCL_ASCII,将 NLS_LANG 设置为 AMERICAN_AMERICA.US7ASCII。否则,如果可能的话,请将 NLS_LANG 值设置为与数据库字符集相匹配的值。例如,如果该阶段将记录写入一个具有 AL32UTF8 数据库字符集的数据库,那么可以使用 NLS_LANG 值 AMERICAN_AMERICA.AL32UTF8 并确保作业的 NLS 映射名被设置为 UTF-8。要确定数据库字符集,可从 SQL*Plus 连接到数据库并发出
中所示的语句。清单 9. 确定数据库字符集SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';始终确保作业中由 Char 和 VarChar 链接列表示的值的实际编码符合 NLS 映射名和 NLS_LANG 设置的规定,而且 NChar 和 NVarChar 链接列的值采用 UTF-16 编码。请注意,连接器会处理 Extended 属性被设置为 Unicode 的 Char 和 VarChar 链接列,它处理这些链接列的方式与处理 NChar 和 NVarChar 链接列的方式相同。确保所有 Char、VarChar、NChar 和 NVarChar 链接列的 Length 属性均被设置为一个具体的值。将 Length 属性保留为空可能对阶段的性能带来严重的负面影响。当 Length 未指定时,连接器会假设长度为各个绑定参数允许的最大值,也就是 4000 字节。因此,连接器会分配具有假设的列长度的内存,这可能导致消耗大量内存。假设连接器被配置为采用默认的 Array size 5000 将行插入数据库表中,该链接包含 50 个没有设置 Length 属性的 VarChar 列。连接器将(在每个执行者进程中)分配大约总共 50(列)x 5000(数组大小)x 4000(最大值长度)字节,这接近于 1 GB。如果数据库中的实际表列定义为 VARCHAR2(50 BYTE),那么通过将链接列的 Length 属性设置为 50,将 Array size 设置为 5000,为每个执行者进程分配的内存大小可以减少至 50(列) x 5000(数组大小)x 50(最大值长度)字节,这大约为 12 MB。不要使用 LongVarBinary、LongVarChar 和 LongNVarChar 链接列来表示 CHAR、VARCHAR2、NCHAR 和 NVARCHAR2 表列。这些链接列适合用来处理 LONG、LONG RAW、BLOB、CLOB、NCLOB 和 XMLType 类型的列,本文
将会讨论这些情况。甚至在这些情况下,如果这些列的实际值小于 4000 字节,那么应该使用 Binary、VarBinary、Char、VarChar、NChar 和 NVarChar 链接列,而不使用 LongVarBinary、LongVarChar 和 LongNVarChar 链接列。当使用 LongVarBinary、LongVarChar 和 LongNVarChar 链接列时,连接器会禁用数组处理,将 Array size 值设置为 1,即使为这些链接列指定了较小的 Length 属性值。将 Array size 设置为 1 可能对性能产生较大的负面影响。确保连接器对 Char、VarChar、NChar 和 NVarChar 链接列使用了最理想的字符集格式。字符集格式是一种 Oracle 数据库概念,可以使用两个值:IMPLICIT 和 NCHAR。连接器为 CHAR 和 VARCHAR2 表列使用的最佳的字符集格式为 IMPLICIT,而对于 NCHAR 和 NVARCHAR2 表列,使用的字符串格式为 NCHAR。如果将 Char 和 VarChar 链接列用于 CHAR 和 VARCHAR2 表列,将 NChar 和 NVarChar 链接列用于 NCHAR 和 NVARCHAR2 表列,那么连接器会自动使用最理想的字符集格式。前面已经提到过,请注意,Extended 属性被设置为 Unicode 的 Char 和 VarChar 链接列被视为是 NChar 和 NVarChar 链接列。在某些情况下,您最终使用的链接列可能导致连接器选择了欠佳的字符集格式。例如,当使用连接器导入一个表,而且该表具有基于字符长度语义的 VARCHAR2 列和基于 AL32UTF8(多字节)字符集的数据库时,连接器会将该列导入为 NVarChar 链接列。通过这种方式导入链接列,连接器能够设置链接列的 Length 属性,使之与表列定义中指定的长度匹配,同时确保不会在运行时发生数据截断。在运行时,连接器将为此链接列选择字符集格式 NCHAR,这不是 VARCHAR2 目标表列的最佳选择。如果此链接列恰好在为阶段指定的语句中的 WHERE 子句中被引用,那么在此表列上定义的任何索引都不会被利用。这适用于配置为稀疏查找模式的阶段所使用的 SELECT 语句,在连接器配置为以 Insert、Update、Delete、Insert then update、Update then insert 或 Delete then insert 写入模式将记录写入数据库时,还适用于 UPDATE 和 DELETE 语句。在这种情况下,跳过索引可能对性能产生重大影响。在这种情况下,要强制连接器使用最佳的字符集格式,可以应用以下策略:将链接列数据类型从 NVarChar 更改为 VarChar。在这种情况下,还需要更新此链接列的 Length 属性,将它乘以 4,因为 UTF-8 字符最多可使用 4 个字节。前面已经提到过,如果知道该阶段处理的所有的实际数据值都使用单字节字符,那么您可保留 Length 属性原封不动。将表列的数据类型更改为 NVARCHAR2。在这种情况下,连接器选择的 NCHAR 字符集格式将是最佳选择。但是,在许多实际情况下,更改数据库表中的现有列定义是不可行的。利用 CC_ORA_BIND_FOR_NCHARS 环境变量。设置作业的这个环境变量的值,以便包含您希望连接器对其使用 NCHAR 字符集格式的链接列名称的逗号分隔列表。如果为此环境变量指定特殊值 (none),那么连接器将对链接上的所有列使用 IMPLICIT 字符集格式。另一个特殊值是 (all)(圆括号是该值的一部分),它将导致连接器为链接上的所有列使用 NCHAR 字符集格式。如果数据库中没有表包含 NCHAR、NVARCHAR2 和 NCLOB 列( 将讨论),那么可在 DataStage 项目级别上定义 CC_ORA_BIND_FOR_NCHARS 环境变量,指定 (none) 作为它的默认值(再次说明,圆括号是该值的一部分)。这样,连接器将始终使用 IMPLICIT 格式,该格式始终是最佳的字符集格式。表示 NUMBER、FLOAT、BINARY_DOUBLE 和 BINARY_FLOAT 表列数据类型在这一节中,我们将介绍 NUMBER、FLOAT、BINARY_DOUBLE 和 BINARY_FLOAT Oracle 数据类型。对于 NUMBER(p, s) 表列,其中精度 p 和量表 s 是显式指定的,默认的最佳链接列数据类型是 Decimal,其 Length 属性被设置为 p,Scale 属性被设置为 s。此规则的一个例外是 s & 0 和 s & p 的情形。在这些情况下,需要将值提供给该阶段,并以文本格式从该阶段检索这些值,所以链接列应为 VarChar 类型,Length 属性值的大小应该足够容纳表中各个列的所有可能值。对于 NUMBER(p) 表列,其中显式指定了精度 p,但省略了比例系数 s,默认的链接列数据类型为 Decimal,且其 Length 属性被设置为 p,Scale 属性保留为空。如果作业中的剩余阶段处理这些列的整数(TinyInt、SmallInt、Integer 或 BigInt)值,那么与将这些整数数据类型更改为 Decimal 数据类型相比,将它们保留给 Oracle Connector 阶段的链接上的列会带来更高的性能。在连接器阶段向分区表写入数据,相应的表列被用作表的分区键的一部分,并为链接的 Partition type 设置指定了 Oracle connector 值时,尤其如此。如果决定将 Decimal(p) 链接列替换为整数链接列,请记住这些链接数据类型之间的区别。尽管它们都表示整数值,但它们涵盖的值范围不同。例如,如果一个表列被定义为 NUMBER(5),并且您选择将默认的 Decimal(5) 链接列替换为 SmallInt 链接列,那么 NUMBER(5) 表列支持的值将在范围 [-9] 内,SmallInt 链接列支持的值将在范围 [-3] 内。如果将链接列的 Extended 属性设置为 Unsigned,该链接列支持的值将在 [0, 65535] 范围内。在这两种情况下,链接列的范围都是各个表列的子范围。所以,只有在确定该阶段将处理的所有值都属于这两个范围时,才应该使用此方法。在前一个示例中,可以在将值写入数据库时选择使用 SmallInt 链接列(有符号或无符号),但在从数据库读取值时使用 Integer 列(有符号),因为 Integer(有符号)链接列支持的值范围是 [-, ],足以支持受 NUMBER(5) 表列支持的任何值。请注意,如果选择在链接上使用 BigInt 列,那么该链接列支持的值范围将是 [-75807]。如果 Signed 列属性被设置为值 Unsigned,那么该范围将是 [0, ]。但是,与使用 TinyInt、SmallInt 或 Integer 链接列相比,BigInt 链接列的选择带来的性能获益可能更少,甚至可能带来比 Decimal 链接列更差的性能。这是因为连接器将以文本值形式与数据库交换 BigInt 链接列值,这涉及到额外的数据类型转换。对于精度 p 和比例系数 s 都被省略的 NUMBER 表列,默认链接列数据类型为 Double。但是,如果确定表中的实际值都是整数值,那么您可以选择使用具有一种整数数据类型(TinyInt、SmallInt、Integer 和 BigInt)的链接列,或者可选择使用 Decimal 数据类型的链接列将值表示为具有特定的精度和比例系数的小数值。请记住,这些链接列数据类型的支持范围并不完全兼容,所以仅在不会导致由于舍入而引起数据精度下降时,或者在这样的舍入可接受时,才使用这些链接列数据类型。对于 FLOAT、BINARY_DOUBLE 和 BINARY_FLOAT 表列,对相应的链接列使用的默认和最佳的列类型分别是 Float、Double 和 Float。在这一节中,我们将介绍 DATE、TIMESTAMP 和 INTERVAL Oracle 数据类型。对于 DATE、TIMESTAMP(0)、TIMESTAMP(0) WITH TIME ZONE 和 TIMESTAMP(0) WITH LOCAL TIME ZONE 表列,默认链接列数据类型为 Timestamp,它的 Extended 属性保留为空。在值的小时、分钟和秒部分都需要保留时,这是最佳的链接列类型。否则,Date 链接列可能获得更高的性能,因为该阶段不需要处理值中的小时、分钟和秒。请注意,如果需要将时区信息保留在值中,那么需要使用基于字符的链接列,比如 VarChar。这将在本节后面详细介绍。对于 TIMESTAMP(p)、TIMESTAMP(p) WITH TIME ZONE 和 TIMESTAMP(p) WITH LOCAL TIME ZONE 表列,精度 p & 0,默认链接列数据类型为 Timestamp,Extended 属性被设置为 Microseconds。在 Oracle Connector 中对 Extended 属性设置为 Microseconds 的 Timestamp 链接列的处理将花的时间,比对 Extended 属性为空的 Timestamp 链接列的处理所花的时间更长。对于 SELECT 和 DML(INSERT、UPDATE、DELETE)语句以及较小范围的批量加载操作,尤其如此。避免使用将 Extended 属性设置为 Microseconds 的 Timestamp 链接列,除非明确需要在时间戳值中支持小数形式的秒。连接器对 TIMESTAMP(p)、TIMESTAMP(p) WITH TIME ZONE 和 TIMESTAMP(p) WITH LOCAL TIME ZONE 表列进行建模时,使用 p & 6 作为 Timestamp 链接列,将 Extended 属性设置为 Microseconds。在这种情况下,连接器会截断包含小数部分的秒 (fractional second),使之精确到微秒级。要处理精度大于 6 个小数位且不超过 9 个小数位的包含小数部分的秒的时间戳值,可使用 VarChar 链接列。在这种情况下,连接器将以文本值的形式与 Oracl 客户端交换时间戳值。此时需要确保 NLS_TIMESTAMP_FORMAT 会话参数的设置与阶段的输入链接上提供的实际值的格式相匹配。该阶段会将相同的格式用于输入链接上提供的值。可使用 Before SQL (node) statement 属性设置此会话参数,发出 ALTER SESSION 语句。例如,要以包含 9 个小数位的文本值形式处理时间戳值,可在 Before SQL (node) statement 属性中指定
中所示的语句。清单 10. 为会话设置包含 9 个小数位的秒的时间戳格式ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF9' 可将同样的方法应用于 TIMESTAMP(p) WITH TIME ZONE、INTERVAL YEAR (yp) TO MONTH 和 INTERVAL DAY(dp) TO SECOND(sp) 表列。对于 TIMESTAMP(p) WITH TIME ZONE 表列,可以将 NLS_TIMESTAMP_TZ_FORMAT 会话参数设置为合适的格式,如果需要在值中保留时区,则需要包含时区格式。INTERVAL(yp) TO MONTH 和 INTERVAL DAY (dp) to SECOND(sp) 值应指定为具有 Oracle 数据库中定义的格式的内部文字。请参见
部分,获取 Oracle Database 在线文档的链接,您可在其中找到 INTERVAL Oracle 数据类型和内部文字的更多细节和示例。在使用 Timestamp(带 Microseconds)链接列时,因为您需要在时间戳值中保留微秒,所以可以再次应用同样的方法,这样做可能会提高性能。例如,如果从一个 TIMESTAMP 表列抓取值,并且下游阶段能够处理文本格式的时间戳值,那么可将 Oracle Connector 阶段的输出链接上的 Timestamp(带 Microseconds)列替换为 VarChar 列,以便连接器以文本格式提供时间戳值。类似地,如果将值插入一个 TIMESTAMP 表列,并且上游阶段能够以文本格式提供时间戳值,那么可以将 Oracle Connector 阶段的输入链接上的 Timestamp(带 Microseconds)列替换为 VarChar 列,以便连接器能接受文本格式的时间戳值。VarChar 列的 Length 属性和 NLS_TIMESTAMP_FORMAT 会话变量必须适合时间戳文本值的格式。例如,要对时间戳值使用默认的 YYYY-MM-DD hh:mm:ss.ffffff 格式,可将 VarChar 列的 Length 属性设置为 26,在 Before SQL (node) statement 连接器属性中指定
中所示的语句。清单 11. 为会话设置具有 6 个小数位的秒的时间戳格式ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF6'在作业的剩余阶段可能无法处理带微秒的文本格式时间戳值,而需要使用 Timestamp(带 Microseconds) 链接列时,也可选择使用 Transformer 阶段,显式地将此列映射到 Oracle Connector 阶段的 VarChar 列,如下所示:如果链接列位于 Oracle Connector 阶段的输出链接上,并且链接名为 out_link,那么可以在 Oracle Connector 阶段与作业流中的下一个阶段之间插入一个 Transformer 阶段,使用
中所示的派生代码将 Transformer 的输入链接上的 VarChar(26) 列映射到 Transformer 阶段的输出链接上的 Timestamp(带 Microseconds)列。清单 12. 将字符串转换为时间戳TimestampToString(in_link.C1,"%yyyy-%mm-%dd %hh:%nn:%ss.6")如果列位于 Oracle Connector 阶段的输入链接上,并且该链接名为 in_link,那么可以在作业流中前一个阶段与 Oracle Connector 阶段之间插入一个 Transformer 阶段,使用
中所示的派生代码将 Transformer 阶段的输入链接上的 Timestamp(带 Microseconds)列映射到 Transformer 阶段的输出链接上的 VarChar(26) 列。清单 13. 将时间戳转换为字符串TimestampToString(in_link.C1,"%yyyy-%mm-%dd %hh:%nn:%ss.6")表示 RAW 表数据类型在这一节中,我们将介绍 RAW Oracle 数据类型。使用 VarBinary 链接列以原生的原始二进制格式读取和写入 RAW 表列值。对于链接列的 Length 属性,指定各个 RAW 表列的大小。如果需要以十六进制数字对序列的形式读取或写入二进制值,可使用 VarChar 链接列。在这种情况下,请确保已将链接列的 Length 属性设置为各个 RAW 表列大小的两倍,因为 RAW 表列值中的每个字节将由一对十六进制数字(0-9 和 A-F)字符表示。使用 VarChar 链接列将使您能够以十六进制数值对的形式读取和写入 RAW 表列值,无需在作业的另一个阶段中处理转换。表示 LONG、LOB 和 XMLType 表列数据类型在这一节中,我们将介绍 LONG、LONG RAW、BLOB、CLOB、NCLOB 和 XMLType Oracle 数据类型。这些表列数据类型首选的链接列数据类型如
所示。表 2. LONG、LOB 和 XMLType 表列数据类型的首选链接列数据类型表列数据类型首选的链接列数据类型BLOB、LONG RAWLongVarBinaryCLOB、LONG 和 XMLTypeLongVarCharNCLOBLongNVarChar也可使用链接和表列数据类型的其他组合,但这么做会给性能带来负面影响,可能需要在 SQL 语句中使用额外的数据类型转换函数来避免数据类型失配误差 (mismatch error)。每一次在链接上定义 LongVarBinary、LongVarChar 或 LongNVarChar 列后,连接器都会为该链接将 Array size 值设置为 1,这对性能具有负面影响。这就是只能在处理本节介绍的表列数据类型时使用 LongVarBinary、LongVarChar 和 LongNVarChar 链接列的主要原因。当 LongVarBinary、LongVarChar 和 LongNVarChar 链接列表示的值不超过 4000 字节时,您应分别使用 VarBinary、VarChar 和 NVarChar 链接列,甚至在相应的表列具有本节讨论的数据类型时也需要这样做。在这样做的时候,连接器不会将 Array size 值设置为 1,这通常会带来显著的性能提升。同样,之前提供的针对
表列数据类型的指南也适用于这种情形,而本节剩余部分提供的指南将不适用。当将连接器阶段配置为从一个由 LongVarBinary、LongVarChar 或 LongNVarChar 链接列表示的表列抓取值时,对于连接器应如何将该列的抓取值传递到输出链接,您有两个选择。您可以将该极端配置为以内联形式传递值,这意味着每个值以其原始格式传递到输出链接。也可以将该阶段配置为按引用来传递值,这意味着会传递一个表示每个值的位置的定位符字符串,而不会传递实际的值。然后作业中最后一个下游阶段会抓取定位符字符串表示的实际值,并将其存储在想要的目标中。定位符字符串包含的信息指定了如何从来源检索实际的值。默认情况下,Oracle Connector 阶段以内联形式传递值。要按引用传递值,需要将 Enable LOB references 连接器属性设置为 Yes,然后在 Columns for LOB references 连接器属性中,指定您为了按引用传递值而希望连接到的输入链接列的名称。在决定按引用或以内联方式传递 LongVarBinary、LongVarChar 和 LongNVarChar 链接列的值时,可参考以下指南:这些值仅需要通过作业传递,还是需要由作业中的某些阶段解释(解析或修改)?在后一种情况下,不要按引用传递值,因为这样传递的不是值,而是表示它们的定位符字符串。作业中的哪个阶段是值的使用者?只有具有基于连接器的阶段类型的阶段(比如 WebSphere MQ Connector、DB2 Connector、ODBC Connector、Teradata Connector 和 Oracle Connector)能够识别定位符字符串,并将它们解析为实际值。其他阶段类型的阶段将定位符字符串视为实际的字段值。例如,可使用 Oracle Connector 阶段,按引用将 CLOB 值传递到一个 DB2 Connector 阶段,以便将该值存储在 DB2 数据库中的 CLOB 列中。但是,如果按引用将该值传递到某个 Sequential File 阶段,那么定位符字符串将存储在目标文件中,而不是实际的 CLOB 值。可使用后一种场景来检查定位符字符串的大小,这样您就可以将它们与实际值的平均大小进行对比,估算出与传递实际值相比较,在传递定位符字符串时,通过作业传输能够节省的数据量。通常,定位符字符串的长度不超过 2000 个字符。实际值有多大?值越大,按引用传递它们有可能获得性能改善。作为经验规则,大约 100 KB 的值应以内联方式传递,否则应按引用传递。理解您环境的具体细节与您指定的实际测试,这些可以帮助您做出决定。例如,如果从数据库读取值的 Oracle Connector 阶段在一个 DataStage 引擎主机上运行,并且该主机不同于下游阶段用来使用这些值的主机,那么按引用传递值可能带来性能改善,对于较小的实际值也是如此(只要它们仍然大于定位符字符串),因为在各个阶段的执行者进程之间交换它们时需要通过网络进行传输。请注意,DataStage 对在作业中的执行者进程之间传输的记录大小设置了限制。APT_DEFAULT_TRANSPORT_BLOCK_SIZE 内置 DataStage 环境变量可用于控制此限制,其默认设置为 131072 字节(128 KB)。例如,如果以内联方式传递链接列值,并且这些这使用了数百 KB,那么需要修改此环境变量,将它设置为足够大的值,否则将在运行时收到一个错误消息,指出该记录太大,无法放入一个块中。请设置此环境变量的值,使之能够容纳通过作业传递的最大记录。不要将它设置得太大,因为该值将应用于作业中所有链接上的所有播放器链接,所以此值的增大可能导致作业的内存使用明显增加。Oracle Connector 阶段按如下方式处理由 LongVarBinary、LongVarChar 和 LongNVarChar 链接列表示的值:对于读取模式(抓取),它利用以下两种 Oracle 机制之一:分段抓取或 LOB 定位符。连接器检查来源表列的数据类型,自动选择最适合该数据类型的机制。对于批量写入模式,它在加载较大值时利用 Oracle 直接路径接口。再一次,连接器自动执行此操作,无需考虑额外的选项。对于除批量加载以外的写入模式,它利用以下两种 Oracle 机制之一 - 分段插入/更新或 OCI LOB 定位符。默认情况下,它使用分段插入/更新。要强制连接器对一些链接列使用 OCI LOB 定位符,可在一个逗号分隔的列表中指定这些链接列名,将该列表设置为作业的 CC_ORA_LOB_LOCATOR_COLUMNS 环境变量的值。要对所有 LongVarBinary、LongVarChar 和 LongNVarChar 链接列使用 OCI 定位符字符串机制,可为此环境变量指定特殊值 (all)(圆括号包含在值中)。请注意,对于表示 LONG 和 LONG RAW 目标表列的链接列,连接器必须配置为使用分段插入/更新机制。另请注意,对于表示 XMLType 目标表列的链接列,连接器必须配置为使用 OCI 定位符字符串机制,只要值大于 4000 字节。不要将 LOB 定位符与按引用传递值时使用的定位符字符串相混淆。前者是一种访问数据库中的较大值的 Oracle 机制,后者是一种通过作业传播较大值的 DataStage 机制。 介绍 CHAR、VARCHAR2、NCHAR 和 NVARCHAR2 表列数据类型的一节中介绍的影响性能的字符集格式和字符集转换考虑因素在这里也适用。在考虑这些因素时,假设使用的是 LongVarChar 和 LongNVarChar 链接列,而不是 VarChar 和 NVarChar 链接列。在本节中已看到,要在目标表中填充包含 LongVarBinary、LongVarChar 和 LongNVarChar 链接列的记录,您有 3 个不同的选项:批量加载模式、带分段插入机制的插入模式,以及带 OCI LOB 定位符机制的插入模式。在值以内联值形式到达阶段时,以及在它们以定位符字符串(按引用传递的值)到达时,这 3 种模式均可用。通常,批量加载模式会提供最佳性能,随后是带分段插入机制的插入模式,最后是带 OCI LOB 定位符机制的插入模式。根据您环境的具体情况,实际情况并不总是这样的,确定哪个选项能提供最佳性能的一种方式是,运行一系列测试并对比结果。一个例外情况是在目标表拥有 XMLType 数据类型的列时,在这种情况下,如果对这些 XMLType 列使用了 BINARY XML 或 OBJECT RELATIONAL 存储类型(而不是 CLOB 存储类型),或者如果表定义为 XMLType 对象表,则不应考虑批量加载模式。当抓取、插入或更新 XMLType 值时,可利用 Oracle XMLType 包函数 GETCLOBVAL、GETBLOBVAL 和 CREATEXML。请参见
一节,获取 Information Server 信息中心的链接,您可在其中找到使用连接器访问 XMLType 列的示例语句。结束语在本文中,我们介绍了 DataStage 作业中 Oracle Connector 阶段的性能调优的各个方面。我们讨论了如何在考虑了数据量考虑因素的情况下在批量模式下运行 Oracle Connector,并处理表触发器、索引和约束。我们还分析了处理包含错误的输入记录的拒绝链接考虑因素。最后,我们分析了链接列的数据类型对连接器性能有何影响。将
部分列出的信息和您通过自己的研究收集的信息相结合,本文应该可以帮助您实现 DataStage 作业中的 Oracle Connector 阶段的最佳性能。致谢衷心感谢以下人对本文提供宝贵的建议和审阅本文: Paul Stanley,InfoSphere 高级架构师 Tony Curcio,InfoSphere 产品经理 Fayaz Adam,InfoSphere 高级软件工程师
参考资料 使用
请求本系列的后续文章的通知。(查阅
的更多信息。)浏览 ,您可在其中找到 Information Server 工具和组件(比如 DataStage 和 Oracle Connector)的技术文档。查阅
页面并下载红皮书,比如
中查找本文中提及的 Oracle Database 概念的更多信息。随时关注 IBM 产品和 IT 行业,参加 。在 。 在 ,了解关于信息管理的更多信息,获取技术文档、how-to 文章、培训、下载、产品信息以及其他资源。随时关注 developerWorks 和。 以对您最方便的方式 :下载产品试用版,在 SOA 沙盒环境中在线试用产品几小时,或者在云计算环境中访问产品。加入 ,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。加入 ,参与在线交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
IBM PureSystems(TM) 系列解决方案是一个专家集成系统
通过学习路线图系统掌握软件开发技能
软件下载、试用版及云计算
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Information ManagementArticleID=956547ArticleTitle=在 IBM InfoSphere DataStage 中调优 Oracle Connector 性能,第 2 部分: 批量加载操作的优化以及拒绝链接和数据类型的考虑因素publish-date=

我要回帖

更多关于 脚后跟疼是怎么回事 的文章

 

随机推荐