首页 > 解决方案 > SSIS 2017 包成功完成,但没有来自 ole dB oracle 源的 ole db oracle 目标的所有数据

问题描述

我有一个具有 ole dB 源(oracle 11g)的 SSIS 包,该包具有数千万条记录,并且我尝试将相同的数据插入到具有快速加载选项的 oracle 12c ole dB 目标中。包成功完成,没有错误,但目标表没有任何数据,包显示已插入大约 400 万条记录,黄色旋转仍在旋转。

我正在使用 sql server 2017 和 windows server 2016 与 Visual Studio 2017。我的观察之一是包正在调整,直到临时缓冲区已满,然后它不是。

标签: oraclessis

解决方案


我对 SSIS 唯一了解的是,它在性能方面是一头猪。它通过网络逐行、缓慢地获取每一行。我曾经遇到过一个问题,开发人员试图使用 SSIS 将大约一百万行从 oracle db 加载到 mssql db。花了四个多小时。我花了 30 分钟来获得良好的跟踪并观察缓慢的活动,另外 15 分钟让我在源 oracle dbd 中编写 PL/SQL 过程。该过程在大约 4 分钟内运行负载 --- 而 SSIS 需要超过 4 小时。

为此,您首先需要在数据库中创建一个将驱动该过程的数据库链接。在这里,我将假设源数据库。

CREATE DATABASE LINK tgt_db
   CONNECT TO hr IDENTIFIED BY password
   USING 'tgt_db';

USING 'tgt_db' 告诉它使用 tnsames 条目 'tgt_db' 来解析与目标数据库的网络连接。

然后它很简单

insert into target_table@tgt_db 
     (col1, 
      col2, 
      col3) 
values (select col1, 
               col2, 
               col3 
        from local_table
        );

当然,您可以将该 INSERT 放入一个 PL/SQL 过程中,该过程还可以包括用于从目标等中删除的任何逻辑,然后在 dbms_scheduler 中调度该过程。或者,您对从源中提取的目标数据库应用相同的原则。


推荐阅读