Oracle Data Integrator 中的知识模块 (KM) 是在不同技术间实施可重用转换和 ELT(提取、加载和转换)策略的组件。例如,通过从 Oracle 数据库 10g 中的更改数据捕获提取数据,而后将转换的数据加载到 Oracle 数据库 11g 中已分区的事实表中,或者从 Microsoft SQLServer 数据库创建基于时间戳的提取,而后将该数据加载到 Teradata 企业数据仓库中。 KM 的强大在于其可重用性和灵活性 — 例如,您可以针对某个事实表开发和实施加载策略,然后只需点击鼠标,即可将此加载策略应用到所有的事实表。如果您调整 ELT 策略以适应不断变化的业务要求并修改相关 KM,则所有使用该 KM 的接口都将继承该更改。您可以混合搭配不同的编程语言、类型和样式(本地 RDBMS SQL、脚本编写语言,如 Jython 或 JavaScript,甚至是 Java)。这使得这些 KM 变得极为灵活。这种创新方法称为 Oracle Data Integrator 声明式设计,可比传统的 ELT 方法快 10 倍。 Oracle Data Integrator 附带了各种预定义的 KM。您可以直接在 ELT 接口(等同于 Oracle Warehouse Builder 映射)中使用这些 KM,或对其进行调整以适应您的特定要求。Oracle Data Integrator 实施五种不同类型的 KM。每一种都涵盖从源到目标转换流程中的一个阶段。最重要的三类模块是 集成知识模块 (IKM)、加载知识模块 (LKM) 以及检查知识模块 CKM。 在本文中,我们将新建一个 IKM。我们对于此 IKM 的要求是将已分区的 Sales 事实表加载到Sales History (SH) 示例模式中。为了改进事实表的加载性能,我们在加载过程中禁用了外键约束和位图索引。加载后,这些禁用将会解除。作为这个 IKM 的一部分,我们还将包括一个可选步骤,以允许我们在接口执行期间进行扩展跟踪。 前提条件和资源本文基于 Oracle 数据库 11g (11.1.0.7.0) 和 Oracle Data Integrator 10.1.3.4.0。 本文假设您已经设置了 Oracle Data Integrator 主信息库和工作信息库。 创建源模式
首先,我们将新建一个模式和一个表。这将是我们的数据源。我们还将向该表插入两条记录。现实中,您的数据可能要远比这多,但为了演示目的,两条记录已足够。通过 SQL+ 以用户 sys 的身份登录并执行以下语句: SQL> CREATE USER sales_source IDENTIFIED BY sales_source; User created. SQL> GRANT CONNECT TO sales_source; Grant succeeded. SQL> GRANT RESOURCE TO sales_source; Grant succeeded. SQL> CREATE TABLE sales_source ( 2 PROD_ID NUMBER NOT NULL , 3 CUST_ID NUMBER NOT NULL , 4 TIME_ID DATE NOT NULL , 5 CHANNEL_ID NUMBER NOT NULL , 6 PROMO_ID NUMBER NOT NULL , 7 QUANTITY_SOLD NUMBER NOT NULL , 8 AMOUNT_SOLD NUMBER NOT NULL 9 ) ; Table created. SQL> INSERT INTO sales_source VALUES (13,987,TO_DATE('01/01/1999','DD/MM/YYYY'),3,999,1,500); 1 row created. SQL> INSERT INTO sales_source VALUES (13,987,TO_DATE('01/04/1999','DD/MM/YYYY'),3,999,1,500); 1 row created. SQL> COMMIT; Commit complete.接下来,我们授予目标模式用户 SH 执行 dbms_monitor 程序包的权限。dbms_monitor 程序包将允许我们启动扩展跟踪。SQL> grant execute on dbms_monitor to sh;Grant succeeded.最后,我们为 Oracle Data Integrator 工作模式创建用户。对于某些数据验证和转换操作,Oracle Data Integrator 需要创建(临时)工作对象。最好将这些对象放置在单独的模式中,以避免在数据仓库对象与临时工作对象之间出现混淆。 SQL> CREATE USER odi IDENTIFIED BY odi; User created. SQL> GRANT CONNECT,RESOURCE TO odi; Grant succeeded.创建 Development 上下文上下文用于将物理资源归组至同一环境中。典型的上下文包括 Development、User Acceptance Test (UAT)、Production 等等。 我们使用 Topology Manager 创建上下文。在本文中,我们将仅创建一个 Development 上下文。在 Topology Manager 中,单击 Context 选项卡,然后单击 Insert Context 图标。这将显示上下文的 Definition 选项卡。按照下图所示填充域。
为 SH 模式创建物理和逻辑体系结构重复上一部分中的步骤为 SH 模式设置物理和逻辑模式。调整名称、用户名、口令等以反映 SH 模式的属性。 将 SALES_SOURCE 和 SH 模型反向工程到 Oracle Data Integrator Designer 模块中我们使用 Oracle Data Integrator 模块反向工程源模式和目标模式的元数据。登录 Designer,单击Models 选项卡,单击 Insert Model Folder 图标(如下图所示)。
插入临时表我们结合使用 SQL 和 Oracle Data Integrator 替换 API 将 Sales 临时表从 SALES_SOURCE 模式加载至我们的 Oracle Data Integrator 工作模式。
禁用 FK 约束在将数据加载至 Sales 表之前,我们需要禁用外键。对于大量数据,这将加快加载过程。这对于性能关键的环境(如近乎实时数据仓库)非常重要。 Oracle Data Integrator 在 KM 中包括了一种机制,使我们可以使用隐式游标对 SQL SELECT 语句返回的每行执行操作。为此,您只需在 KM 步骤的 Source 选项卡中指定 SELECT 语句,在Target 选项卡中指定操作代码。这是一个非常不错的特性,因为这可省去用 PL/SQL 手动编码游标,从而节省了很多开发时间。 在 Command on Source 选项卡下,我们按如下所示进行指定:
我们在 Oracle Data Dictionary 中查询 user_constraints 表,返回目标表上(SH 目标模式中的 Sales 表)的所有外键约束列表。 在 Command on Target 选项卡中,我们可以通过为其加上前缀 # 符号引用目标表和约束名并禁用外键约束。
请注意,我针对隐式游标运行了扩展跟踪。对于 Sales 目标表上的每个约束,Oracle Data Integrator 都会向数据库服务器发送一条 ALTER TABLE... 语句。因为 Sales 表上有五个外键,所以我们以五个 ALTER TABLE... 语句结束。 禁用 BIX在该步骤中,我们将禁用 Sales 事实表的位图索引。这将加快事实表的加载速度。我们仅禁用那些会将数据加载到其中的表分区上的位图索引。在我们的示例中,这些将是 1999 年 Q1 和 Q2 的分区。
如之前的步骤所示,我们再次使用一个隐式 Oracle Data Integrator 游标实施该步骤。对于Command on Source 选项卡,我们结合使用 SQL 和 Oracle Data Integrator 替换 API 方法检索插入到临时表中的不同 time_id。根据这些 time_id,我们可以确定目标表中与其相关的分区。odiRef.getTable ("L","INT_NAME","W") 替换 API 方法将为我们检索临时表。