比较从Oracle到SQL服务器的数百万条记录

时间:2016-01-15 06:09:50

标签: sql-server database oracle ssis

我有一个Oracle数据库和一个SQL Server数据库。有一个表Inventory表,它在两个数据库表中都包含数百万行,并且不断增长。

我想将Oracle表数据与SQL Server数据进行比较,以找出每天在SQL Server表中缺少哪些记录。

哪种方法最好?

  1. 创建SSIS包。
  2. 创建Windows服务。
  3. 我希望消耗更少的资源来实现这种功能,这需要更少的时间和更少的资源。

    例如:oracle中有1800万条记录,SQL Server中有16/17百万条记录

    这种情况出现了两种不同的数据库因为两种不同的应用程序在线和离线

    编辑:如何将SQL Server从oracle通过Oracle Gateway连接到SQL Server

    1)从Oracle直接查询SQL服务器,以便第一次更新SQL Server中的缺失记录。

    2)在Oracle上创建一个触发器,当从Oracle删除记录并在新的oracle表中插入已删除的记录时执行该触发器。

    3)创建SSIS包以将新创建​​的oracle表映射到SQL服务器以更新SQL服务器记录。这样,只有少数记录必须每天通过SSIS进行处理。

    您如何看待这种方法?

5 个答案:

答案 0 :(得分:1)

我会创建一个SSIS包,并使用数据流/ OLE DB数据源从Oracle表加载数据。如果您有SQL Enterprise,Attunity连接器会更快一些。

然后我将SQL Server表中的密钥加载到Lookup转换中,我将匹配密钥上的2个源,并将不匹配的行引导到单独的输出中。

最后,我将不匹配的行输出定向到OLE DB命令,以更新SQL Server表。

这个SSIS包需要大量内存,但由于匹配是在内存中以最小的IO完成的,因此它的速度可能优于其他解决方案。它需要足够的可用内存来缓存SQL Server Table中的所有密钥。

SSIS还具有以下优势:如果您以后需要,它还有许多其他转换功能。

答案 1 :(得分:1)

您基本上想要做的是从Oracle复制到SQL Server。

您可以在SSIS,Windows服务或多个平台中执行此操作。 真正的诀窍是使用正确的设计模式。

有两种通用设计模式

  1. 快照复制
  2. 你从两个系统中获取所有记录并在某处比较它们(到目前为止,我们有建议在SSIS中进行比较或在Oracle上进行比较但尚未建议在SQL Server上进行比较,尽管这是有效的)

    你在这里比较1800万条记录,所以这是很多工作

    1. 差异复制
    2. 您记录自上次复制后发布者(即Oracle)中的更改,然后将这些更改应用于订阅者(即SQL Server)

      您可以通过在Oracle端实现触发器和日志表来手动执行此操作,然后使用可能在SQL Agent中安排的常规ETL过程(SSIS,命令行工具,文本文件等)将这些应用于SQL Server

      或者您可以使用现成的复制功能将Oracle设置为发布者,将SQL设置为订阅者:https://msdn.microsoft.com/en-us/library/ms151149(v=sql.105).aspx

      你将不得不尝试其中的一些,看看哪些对你有用。

      鉴于此目标:

        
          

      我希望消耗更少的资源来实现此功能,这需要更少的时间和更少的资源

        

      事务复制效率更高但更复杂。出于维护目的,您最熟悉哪些平台(.Net,SSIS,Python等)?

答案 2 :(得分:0)

其他替代方案:

如果您可以将Oracle网关用于SQL Server,那么您无需传输数据并可以直接进行查询。

如果您不能使用Oracle网关,您可以使用Pentaho数据集成或其他ETL工具来比较表并获得结果。很容易使用。

答案 3 :(得分:0)

我认为最好的方法是使用oracle网关。只需按照步骤操作即可。我有类似的经历。

  1. 安装和配置SQL Server的Oracle数据库网关。 https://docs.oracle.com/cd/B28359_01/gateways.111/b31042/installsql.htm
  2. 现在您可以创建从oracle到sql server的dblink。
  3. 创建一个过程,比较oracle数据库中缺少的记录并插入到sql server数据库中。
  4. 例如,您可以在程序中使用此语句。

    <table class="table">
    @foreach (var item in Model.AllTasks)
    {
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TaskDetails)
            </td>
        </tr>
    }
    
    1. 创建一个每日执行该程序的调度程序。
    2. 当两个数据库都在线时,缺少的记录将被插入到sql server中。否则调度程序失败或您可以手动执行该过程。 它需要最少的资源。

答案 4 :(得分:0)

我建议使用自制的ETL解决方案。

  1. 安排oracle job导出源表数据(每日一次) 基于应用程序逻辑的方式)to plain CSV格式。
  2. 安排SQL-Server job(从第一个oracle作业可接受的延迟)读取此CSV文件并导入它 使用BULK INSERT到sql-servter中的中间表。
  3. SQL-Server作业的最后一部分将是读取中型表数据 并执行逻辑(插入,更新目标表)。我建议另外一张表来存储这份日常工作结果的报告。